Построим проект решения следующего варианта этой задачи:
а) подключим к плате "ESP32" датчик температуры и давления BMP180 и датчик
освещенности (фоторезистор):

b) напишем программу, согласно которой плата будет читать показания датчиков и
передавать их по каналам WiFi связи и посредством нашего
Web-сервера на экраны браузеров удаленных компьютеров или мобильных
устройств;
c) в этой программе организуем автоматическое
включение желтого
светодиода (или
реле) при уменьшении освещенности ниже определенного уровня И включение
красного
светодиода (или реле) при повышении температуры выше определенного
значения;
d) предусмотрим в программе также дистанционное включение и выключение
зеленого светодиода по командам (нажатию кнопок) с экранов
браузеров
удаленных компьютеров или мобильных устройств.
Программа (внимательно читайте комментарии):
Все приводимые в этой книге программы бесплатные, разработаны
различными
энтузиастами, размещены на различных открытых ресурсах в Интернете, ОПРОБОВАНЫ,
отредактированы и ДОПОЛНЕНЫ автором данного пособия,
и предлагаются в качестве опоры при изучении основ программирования по методу -
'посмотри, пойми, повтори, сделай сам и по-своему'.
|
//32WEB bmp180-3leds.ino
#include <Adafruit_BMP085.h>
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BMP085 bmp;
const char* ssid = "...........";
const char* password = "...........";
WiFiServer server(80);
const int led1 = 18; // g
const int led2 = 19; // r
const int led3 = 15; // y
// переменные для web-сервера
char linebuf[80];
int charcount=0;
void setup() {
pinMode(led1, OUTPUT); //g
pinMode(led2, OUTPUT); //r
pinMode(led3, OUTPUT); //y
Serial.begin(115200);
bool status;
if (!bmp.begin()) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
// подключение к WiFi сети
while(!Serial) {
;
}
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin(); //запуск сервера
}
void loop() {
delay(1000);
float sv = analogRead(34)/10; //sensor light
if (sv > 215){
digitalWrite(led3, LOW); //switch on ledY-15
} else {
digitalWrite(led3, HIGH);
}
Serial.print("t C= ");
Serial.print(bmp.readTemperature());
Serial.print(" |P mmHg= ");
Serial.println(bmp.readPressure() / 100.0F*0.7500634);
Serial.print("");
Serial.print(sv);
Serial.println(" lum");
///////автоматическое включение красного led, если t_C>=29 градусов
if (bmp.readTemperature()>=29) {digitalWrite(led2, HIGH);}
else {digitalWrite(led2, LOW);};
///////////////////////////////////////////////////////////
// вывод данных на Web-сайт
WiFiClient client = server.available();
if (client) {
Serial.println("New client");
memset(linebuf,0,sizeof(linebuf));
charcount=0;
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
linebuf[charcount]=c;
if (charcount<sizeof(linebuf)-1) charcount++;
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// сайт
client.println("<!DOCTYPE HTML><html><head>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>");
client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial;}");
client.println("table { border-collapse: collapse; width:35%; margin-left:auto; margin-right:auto; }");
client.println("th { padding: 12px; background-color: #0043af; color: white; }");
client.println("tr { border: 1px solid #ddd; padding: 12px; }");
client.println("tr:hover { background-color: #bcbcbc; }");
client.println("td { border: none; padding: 12px; }");
client.println(".sensor { color:white; font-weight: bold; background-color: #bcbcbc; padding: 1px; }");
// на экран браузера
client.println("</style></head><body><h1>ESP32 with BMP180</h1>");
client.println("<p>LED Gr <a href=\"on1\"><button><b>ON</button></a>-//соединить со след.строкой
- <a href=\"off1\"><button><b>OFF</button></a></p>");
client.println("<br><table><tr><th>MEASUREMENT</th><th>VALUE</th></tr>");
client.println("<tr><td>Temp. Celsius</td><td><span class=\"sensor\">");
client.println(bmp.readTemperature());
client.println(" *C</span></td></tr>");
client.println("<tr><td>Pressure</td><td><span class=\"sensor\">");
client.println(bmp.readPressure() / 100.0F*0.7500634);
client.println(" mmHg</span></td></tr>");
client.println("<tr><td>Svet</td><td><span class=\"sensor\">");
client.println(sv);
client.println(" lum</span></td></tr>");
client.println("</body></html>");
break;
}
if (c == '\n') {
// нажатие кнопoк 'ON' и 'OFF'
currentLineIsBlank = true;
if (strstr(linebuf,"GET /on1") > 0){
//Serial.println("LED 1 ON");
digitalWrite(led1, HIGH);
}
else if (strstr(linebuf,"GET /off1") > 0){
//Serial.println("LED 1 OFF");
digitalWrite(led1, LOW);
}
// обработка запросов
currentLineIsBlank = true;
memset(linebuf,0,sizeof(linebuf));
charcount=0;
} else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
Serial.println("client disconnected");
}
}
|
Пишем (переносим) эту программу в новый файл в "Arduino IDE":

Выбираем плату (ESP32 Dev Module), определяем и выбираем 'порт', запускаем
компиляцию и затем загрузку файла, после начала загрузки нажимаем и удерживаем
3-4 сек кнопку 'BOOT' на плате, если все нормально -> по окончании загрузки
увидим сообщение:

Теперь открываем "инструменты" и "Монитор порта" и видим данные датчиков
(температуры, давления и освещенности):

Для того, чтобы увидеть показания датчиков на Web-странице в браузере,
нажмем (коротко) на кнопку 'EN' на плате:

появится указание - на каком адресе находится наш сервер:

Набрав в любом браузере этот адрес - увидим:

Данные на экране браузера (сайта) будут обновляться при каждом перезапуске
этой страницы:

На сайте мы также видим две кнопки 'ON' и 'OFF', с помощью которых мы можем
дистанционно включать и выключать зеленый
светодиод.
|