Разрабатываем систему контроля за температурой и влажностью на микроконтроллере ESP8266 в среде программирования Arduino IDE, передаем данные в облако.

В данном уроке мы с Вами разработаем устройство которое будет работать автономно и передавать данные в облако, где Вы сможете забирать данные для обработки.

Для начала опишем концепцию (схему) нашего устройства:

Нам необходимо считывать текущие значения температуры и влажности и передавать их в облако для дальнейшей обработки. При этом данное устройство должно работать автономно — от аккумулятора.

И так, нам понадобится:

Модуль ESP8266
OLED

Дисплей SSD1306

Датчик DTH22

Плата заряда аккумулятора с стабилизатором выходного напряжения

Литиевый аккумулятор

В данном случаи мы будем мерять температуру и влажность и выводить ее на экран, так же мы будем мерять заряд аккумулятора и так же выводить его значение на экран в виде картинки (уровень заряда). Еще мы добавим индикацию о наличии подключения к Wi-Fi и удачной передаче данных в облако. В качестве облака будем использовать сервер ThingSpeak.

Работает данное устройство следующим образом:

Так как параметры температуры и влажности у нас меняются медленно, мы будем делать раз в N время делать измерения и отправлять их в облако. При этом, после отправки мы для экономии заряда аккумулятора будем отключать Wi-Fi модуль (использовать один из режимов sleep). Так же у нас будет выводится на экран состояния подключения к Wi-Fi и в случаи не удачной передачи данных в облако так же будет выводиться ошибка. Учитывая, что нам надо контролировать заряд аккумулятора, мы так же выведем на экран в виде картинки уровень заряда аккумулятора.

Схема подключения элементов:

Номинал резисторов у меня составляет 4,5кОм — верхний и 10кОм нижний. Так же будет неплохо если вы по питанию добавите развязывающие конденсаторы. Как пример, можно взять две емкости на 0,1мкФ и 10мкФ.

Весь программный код написан с примеров уроков которые есть на сайте по микроконтроллерам ESP8266:

#include <Ethernet.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP8266WiFi.h>
#include "DHT.h"
#include "ThingSpeak.h"

# define SECRET_SSID "********" // замените MySSID на имя вашей сети WiFi
# define SECRET_PASS "********" // замените MyPassword своим паролем WiFi
# define SECRET_CH_ID ****** // замените 0000000 на номер вашего канала
# define SECRET_WRITE_APIKEY "********" // замените XYZ на свой ключ API записи канала
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password

int n=0;// счетчик подключений
int httpCode1=0;
int httpCode2=0;
WiFiClient client;

#define SCREEN_WIDTH 128 // OLED display width, in pixels

#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET LED_BUILTIN // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define DHTPIN 14 // номер ножки куда подключать датчик D5
#define DHTTYPE DHT22 //определяем тип датчика

float temperature=0;
float humidity =0;
DHT dht(DHTPIN, DHTTYPE, 5);
char T[5]; // текстовый массив
char H[5]; // текстовый массив

const int analogInPin = A0; // ESP8266 Analog Pin ADC0 = A0
float sensorValue = 0; // value read from the pot
float Umin = 2.3;
float Umax = 3.0;
float Urez =0;
void display_page();
int metka =0;

void setup() {
delay(1000);
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
// Инициализация датчика
dht.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
}

void loop() {
//Читаем температуру и давление
humidity = dht.readHumidity();
temperature = dht.readTemperature();
display.display();
//battarey
sensorValue = 3.3*analogRead(analogInPin)/1024;
Urez = ((sensorValue-Umin)/Umin)*(Umin/(Umax-Umin))*100;
if (Urez<=0){Urez=0;}
if (Urez >= 95){Urez=95;}
display_page();
if (WiFi.status() == WL_CONNECTED){
display.setTextSize(1);
display.setCursor(100,5);
display.println("WiFi");
}
if ((httpCode1 == 200)and(httpCode2 == 200)) {
display.setTextSize(1);
display.setCursor(105,15);
display.println("Ok");
}
display.display();
// Connect or reconnect to WiFi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
WiFi.begin(ssid, pass); // Connect to WPA/WPA2 network. Change this line if using open or WEP network
humidity = dht.readHumidity();
temperature = dht.readTemperature();
display_page();
display.display();
delay(500);
display_page();
display.setCursor(100,5);
display.setTextSize(1);
display.println("WiFi");
display.setCursor(105,15);
display.println("Ok");
display.display();
delay(500);
n++;
metka=1;
if(n>=10)break;
}
n=0;
if (WiFi.status() != WL_CONNECTED){
display_page();
display.display();
}
if (WiFi.status() == WL_CONNECTED){
httpCode1 = ThingSpeak.writeField(myChannelNumber, 1,H, myWriteAPIKey);
delay(22000);// Wait 22 seconds to update the channel again
httpCode2 = ThingSpeak.writeField(myChannelNumber, 2,T, myWriteAPIKey);
WiFi.disconnect();
WiFi.forceSleepBegin();// Wifi off
if ((httpCode1 == 200)and(httpCode2 == 200)) {
display_page();
display.setTextSize(1);
display.setCursor(100,5);
display.println("WiFi");
display.setCursor(105,15);
display.println("Ok");
display.display();
}
else {
display_page();
display.setTextSize(1);
display.setCursor(100,5);
display.println("WiFi");
display.display();
}
delay(120000);
WiFi.forceSleepWake(); // Wifi on
WiFi.mode(WIFI_STA);
delay(100);
metka=0;
}
if (metka ==1){
delay(25000);
metka =0;
}
}

void display_page(){
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(2,14);
display.setTextSize(2);
display.print("T=");
dtostrf(temperature, 2, 1, T);
display.print(T);
display.print("C");
display.setCursor(2,44);
display.print("H=");
dtostrf(humidity, 2, 1, H);
display.print(H);
display.print("%");
display.drawRect(102, 30, 16, 30, WHITE);
display.drawRect(107, 26, 6, 4, WHITE);
display.fillRect(102, (30+(30-30*Urez/100)), 16, (30*Urez/100), WHITE);
}

СОДЕРЖАНИЕ

СОДЕРЖАНИЕ