Страницы

26 октября 2018 г.

Код. Связь WeMos и Arduino по UART

Для демонстрации к ранее описанной схеме добавил датчик si7021.
Предполагается, что Arduino Nano будет получать данные о температуре и влажности с датчика si7021. Пересчитывать полученные данные с датчика в градусы Цельсия и Фаренгейта, а затем отправлять по UART данные (влажность, температура С, температура F) на Wemos D1 Mini.
Wemos D1 Mini, являясь одновременно точкой доступа и Web-сервером, получает данные по UART и отображает их на Web странице.
Схема подключения:
На схеме присутствуют:
Wemos D1 Mini (также можно использовать NodeMCU)
Arduino Nano
8-channel Bi-directional Logic Level Converter - TXB0108
Датчик температуры и влажности si7021

Код для Arduino Nano:

#include <Wire.h>
// SI7021 I2C address is 0x40(64)
#define si7021Addr 0x40

void setup() {
  Wire.begin();

  Serial.begin(9600);

  Wire.beginTransmission(si7021Addr);
  Wire.endTransmission();
  delay(300);
}

void loop() {

  unsigned int data[2];

  Wire.beginTransmission(si7021Addr);
  //Send humidity measurement command
  Wire.write(0xF5);
  Wire.endTransmission();
  delay(500);

  // Request 2 bytes of data
  Wire.requestFrom(si7021Addr, 2);
  // Read 2 bytes of data to get humidity
  if (Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }

  // Convert the data
  float humidity  = ((data[0] * 256.0) + data[1]);
  humidity = ((125 * humidity) / 65536.0) - 6;

  Wire.beginTransmission(si7021Addr);
  // Send temperature measurement command
  Wire.write(0xF3);
  Wire.endTransmission();
  delay(500);

  // Request 2 bytes of data
  Wire.requestFrom(si7021Addr, 2);

  // Read 2 bytes of data for temperature
  if (Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }

  // Convert the data
  float temp  = ((data[0] * 256.0) + data[1]);
  float celsTemp = ((175.72 * temp) / 65536.0) - 46.85;
  float fahrTemp = celsTemp * 1.8 + 32;

  String sendData = "T1";
  sendData += humidity;
  sendData += "1T";
  sendData += "T2";
  sendData += celsTemp;
  sendData += "2T";
  sendData += "T3";
  sendData += fahrTemp;
  sendData += "3T";
  Serial.println(sendData);
  delay(1000);
}

Пример вывода:
Результатом выполнения кода будет вывод примерно таких строк раз в секунду.

T145.141TT225.062TT377.113T
T145.101TT225.042TT377.073T
T145.071TT225.052TT377.093T
T145.071TT225.032TT377.053T
T145.051TT225.042TT377.073T
T145.051TT225.062TT377.113T
T145.051TT225.052TT377.093T
T145.041TT225.052TT377.093T


Код для Wemos D1 Mini:

/* подключение необходимых библиотек */
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

String Data1, Data2, Data3;

/* набор переменных для подсчета uptime */
long secs, mins;
int hours, days;

/* набор параметров для создания точки доступа */
const char *ssid = "Demo";
const char *password = "12345678";

/* параметры для создания Web-сервера */
ESP8266WebServer server(80);

void setup() {

  server.on("/", []() {
    server.send(200, "text/html", webPage());
  });

  delay(1000);

  Serial.begin(9600);
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  server.begin();
}

void loop() {

  server.handleClient();

  /*########### Пересчет millis для uptime ###############*/
  secs = millis() / 1000;
  mins = secs / 60;
  hours = mins / 60;
  days = hours / 24;
  secs -= mins * 60;
  mins -= hours * 60;
  hours -= days * 24;
  /*######################################################*/
  
  if (Serial.available()) {
    String Data = "";

    while (!Serial.available()) delay(20);
    delay(400);
    while (Serial.available())
      Data = Data + (char)(Serial.read());

    Data1 = Data.substring(Data.indexOf("T1") + 2, Data.indexOf("1T"));
    Data2 = Data.substring(Data.indexOf("T2") + 2, Data.indexOf("2T"));
    Data3 = Data.substring(Data.indexOf("T3") + 2, Data.indexOf("3T"));
  }
}
String webPage()
{
  String web;
  //Выводим заголовок вкладки
  web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>Web Server</title><style>button{color:red;padding: 10px 27px;}</style></head>";

  //Выводим название страницы
  web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">Demo: Arduino Nano (si7021) -> UART -> Wemos D1 mini (AP+Web Server)</h1><div>";

  //Содержимое страницы
  web += "<p style=\"text-align: left;margin-top: 0px;margin-bottom: 5px;\">Uptime:  " + String(days) + " days " + String(hours) + " h " + String(mins) + " min " + String(secs) + " sec </p>";
  web += "<p style=\"text-align: left;margin-top: 0px;margin-bottom: 5px;\">Climate:  " + String(Data1) + " %RH " + String(Data2) + " C " + String(Data3) + " F </p>";
  
  //############### Кнопка обновить ###############
  web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">Refresh</button></a></div>";
  //###############################################

  web += "</div>";
  return (web);

}

Пример вывода:



Комментариев нет:

Отправить комментарий