ESP32 примеры кода использования датчика температуры и вдлажности DHT22 выводаданных на дисплей SSD1306 обработка много задачности хранение данных в памяти ESP32 использование EEPROM
![ESP32 примеры кода использования датчика температуры и вдлажности DHT22 выводаданных на дисплей SSD1306](/uploads/s/c/y/g/cygvbasvueok/img/full_9poWg2yz.png)
#include "DHTesp.h"
#include <EEPROM.h> //Библиотека для сохранения данных в память
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Ширина OLED-дисплея, в пикселях
#define SCREEN_HEIGHT 64 // Высота OLED-дисплея, в пикселях
// Декларация для дисплея SSD1306, подключенного к I2C (контакты SDA, SCL)
#define OLED_RESET -1 // Сброс pin-кода # (или -1, если используется общий pin-код сброса Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define PINDHT 27
#define PINBUTTON1 26
#define PINLEDBUTTON1 25
#define ESP32RESETPIN 15
bool BUTTON1 = false; //Состояние кнопки зажата или нет
bool STATUSBUTTON1 = false; // Вкл или выкл по стоянию кнопки
bool FLAGBUTTON1 = false; // Удерживается ли кнопка
bool LASTBUTTON1 = false; // Последние состояние кнопки
bool FLAGESP32RESETPIN = false;
DHTesp dhtSensor;
uint32_t timer0 = 0;
uint32_t timer1 = 0;
uint32_t timer2 = 0;
int16_t temperatureC = 0;
float temp = 0.00;
float dav = 0.00;
void setup() {
Serial.begin(115200);
EEPROM.begin(512);//Старт сохранения
Serial.println("ESP32 Start");
pinMode(PINBUTTON1, INPUT_PULLUP);
pinMode(ESP32RESETPIN, INPUT_PULLUP);
pinMode(PINLEDBUTTON1, OUTPUT);
//Читаем состоние кнопки из памяти для STATUSBUTTON1
byte TEMPSTATUSBUTTON1 = EEPROM.read(0); // Читаем значение
if ((TEMPSTATUSBUTTON1 != 0) &&(TEMPSTATUSBUTTON1 != 1)){//Проверяем что считали
STATUSBUTTON1 = false;// если там не тот формат данных, то обнуляем
}
else{
STATUSBUTTON1 = TEMPSTATUSBUTTON1; //Если формат данных верный приравниваем.
}
dhtSensor.setup(PINDHT, DHTesp::DHT22);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
}
display.clearDisplay();
display.setCursor(36, 12);
display.setTextColor(WHITE);
display.setTextSize(2);
display.println("ESP32");
display.setCursor(36, 32);
display.println("START");
display.display();
}
void loop() {
if((millis() - timer0) >= 300){//Раз в 1000 МС
timer0 = millis();
setdisp();
//Serial.println("1000");
}
if((millis() - timer1) >= 500){//Раз в 3 секунды
timer1 = millis();
//Serial.println("3000");
gettemp();
}
if((millis() - timer2) >= 50){//Раз в 1000 МС
timer2 = millis();
getbutton();
//Serial.println("5000");
}
}
void getbutton(){
//BUTTON1 //STATUSBUTTON1 //FLAGBUTTON1 //LASTBUTTON1
BUTTON1 = !digitalRead(PINBUTTON1);//Считываем нажатие кнопки
if(BUTTON1 && LASTBUTTON1){
FLAGBUTTON1 = true; //Кнопка удерживается
//Serial.println("Кнопка удерживается");
}
else{;
FLAGBUTTON1 = false; // Разовое нажатие на кнопку
}
if(BUTTON1){// Проверяем нажание кнопки
if(!FLAGBUTTON1){
STATUSBUTTON1 = !STATUSBUTTON1;
EEPROM.write(0, STATUSBUTTON1);//Записываем состоние кнопки
EEPROM.commit();// потверждаем запись
}
}
digitalWrite(PINLEDBUTTON1, FLAGBUTTON1);
LASTBUTTON1 = BUTTON1; //Записываем последние состояние кнопки
FLAGESP32RESETPIN = !digitalRead(ESP32RESETPIN);
if(FLAGESP32RESETPIN){
ESP.restart();
}
}
void setdisp(){
display.clearDisplay();
display.setCursor(36, 0);
display.setTextColor(WHITE);
display.setTextSize(2);
char ArrayTemp[20];
dtostrf(temp, 2, 2, ArrayTemp);
strcat(ArrayTemp,"C");
display.println(ArrayTemp);
display.setCursor(36, 20);
char ArrayDav[20];
dtostrf(dav, 2, 2, ArrayDav);
strcat(ArrayDav,"%");
display.println(ArrayDav);
display.setCursor(36, 40);
if(STATUSBUTTON1){
display.println("ON");
}
else{
display.println("OFF");
}
display.display();
}
void gettemp(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
temp = data.temperature;
dav = data.humidity;
//Serial.println("Temp: " + String(data.temperature, 2) + "°C");
//Serial.println("Humidity: " + String(data.humidity, 1) + "%");
}