// ================== СИСТЕМА ==================
#define START_MENU 0
// -------------------- БИБЛИОТЕКИ ---------------------
#include "DHTesp.h"
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
// #include <microDS3231.h> // часы rtc
// MicroDS3231 rtc;
#include <EncButton.h>
#include "RTClib.h"
RTC_DS1307 rtc;
// ================= УПРАВЛЕНИЕ =================
#define ENCODER_TYPE 1 // тип энкодера (0 или 1). Если энкодер работает некорректно (пропуск шагов/2 шага), смените тип
#define ENC_REVERSE 1 // 1 - инвертировать направление энкодера, 0 - нет
#define CONTROL_TYPE 1 // тип управления энкодером: 0 - удерживание и поворот для изменения значения, 1 - клик для входа в изменение, повторный клик для выхода (стрелочка меняется на галочку)
#define FAST_TURN 1 // 1 - вкл быстрый поворот
#define FAST_TURN_STEP 10 // изменение при быстром повороте
// #include <GyverBME280.h>
// GyverBME280 bme;
#define LCD_ADDR 0x27 // адрес дисплея - 0x27 или 0x3f . Смени если не работает!
#define BME_ADDR 0x76 // адрес BME280 - 0x76 или 0x77. Смени если не работает!
#define LCD_COLUMNS 20
#define LCD_LINES 4
// -------------------- ПИНЫ ---------------------
#define DHT_PIN 12 // датчик температуры
#define SENS_1 2
#define RELAY_0 1
#define SW 16
#define DT 4
#define CLK 2
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(LCD_ADDR, LCD_COLUMNS, LCD_LINES);
// encMinim enc(CLK, DT, SW, ENC_REVERSE, ENCODER_TYPE);
EncButton enc(CLK, DT, SW);
float sensorVals[6];
float uptime = 0; // дней работы
// -------------------- ПЕРЕМЕННЫЕ ---------------------
boolean serviceFlag = 0;
int8_t lastScreen = 1;
int8_t currentScreen = 0;
uint32_t commonTimer, backlTimer;
boolean backlState = true; // подсветка дисплея
int8_t realTime[3]; // время
uint32_t sensorTimer = 0; // таймер опроса датчиков
uint32_t period = 3000; // период опроса датчиков
struct {
boolean backlight = 1; // автоотключение подсветки дисплея по таймауту бездействия (1 - разрешить)
byte backlTime = 10; // таймаут отключения дисплея, секунды
byte drvSpeed = 125; // скорость привода, 0-255
} settings; //21
void setup() {
Serial.begin(9600);
initHardware();
}
void loop() {
timersTick(); // таймер времени
backlTick(); // таймер неактивности подсветки
timersTick(); // таймер времени
controlTick();
// readAllSensors();
printScreen();
// settingSC();
}
void readAllSensors() {
if (millis() - sensorTimer >= period) {
sensorTimer = millis();
getAllData();
}
}
void getAllData() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
sensorVals[0] = 0;
sensorVals[1] = 0;
sensorVals[2] = data.temperature;
sensorVals[3] = data.humidity;
sensorVals[4] = 0;
sensorVals[5] = 0;
sensorVals[6] = 0;
for (int i = 0; i < 6; i++) {
Serial.println(sensorVals[i]);
}
}
void initHardware() {
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Init
// ----- дисплей -----
lcd.init();
lcd.backlight();
// delay(2000);
lcd.clear();
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
// показаны значения по умолчанию
enc.setBtnLevel(LOW);
enc.setClickTimeout(500);
enc.setDebTimeout(50);
enc.setHoldTimeout(600);
enc.setStepTimeout(200);
enc.setEncReverse(0);
enc.setEncType(EB_STEP4_LOW);
enc.setFastTimeout(30);
}
// Включение подсветки экрана
void backlOn() {
backlState = true;
backlTimer = millis();
lcd.backlight();
}
void backlTick() {
if (backlState && settings.backlight && millis() - backlTimer >= (long)settings.backlTime * 1000) {
backlState = false;
lcd.noBacklight();
}
}
void timersTick() {
if (millis() - commonTimer > 1000) {
commonTimer += 1000;
// DateTime now = rtc.now();//!!!!!!!
// получаем время
realTime[0] = rtc.now().hour();
realTime[1] = rtc.now().minute();
realTime[2] = rtc.now().second();
// getDay(); // получить номер дня
// uptime += (float)0.0000115741; // аптайм у нас в сутках! 1/(24*60*60)
}
}
void controlTick() {
enc.tick(); // отработка энкодера
if (enc.left()) Serial.println("left");
if (enc.right()) Serial.println("right");
if (enc.click()) Serial.println("click");
if (enc.turn()) {
// settingsTimer = millis();
backlTimer = millis();
serviceFlag = !serviceFlag;
if (!backlState) {
backlOn();
return;
}
}
if (enc.click()) {
// settingsTimer = millis();
backlTimer = millis();
if (!backlState) {
backlOn();
return;
}
}
// if (enc.click()) Serial.println("cliqack");
}Loading
ds18b20
ds18b20