Для демонстрации к ранее описанной схеме добавил датчик si7021.
На схеме присутствуют:
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);
}
Код для 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);
}
Пример вывода:
Предполагается, что 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);
}
Пример вывода:
Комментариев нет:
Отправить комментарий