Есть вот такой код
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <RTClib.h>
#define DHTPIN D4 // Тот самый номер пина, о котором упоминалось выше
#define DHTPIN1 D3
#define solPin D7
#define smokePin A0
#define CLK D5
#define DT D6
int val = 0, svet = 0, vlazh = 0, gaz = 0, vremya = 0;
int value = 0;
int currentStateCLK;
int lastStateCLK;
float vlaga = 0;
float temp = 0;
// Одна из следующих строк закоментирована. Снимите комментарий, если подключаете датчик DHT11 к arduino
DHT dht(DHTPIN, DHT22); //Инициация датчика
DHT dht1(DHTPIN1, DHT11);
LiquidCrystal_I2C lcd(0x3F, 20, 4);
int pinD0 = D0; //пин для датчика света
int sol, minsol = 200, sensorThres = 500;
RTC_DS3231 rtc;
char tim[32];
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
dht.begin();
dht1.begin();
pinMode(solPin, INPUT);
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
lastStateCLK = digitalRead(CLK);
}
void loop() {
Serial.println(value);
Serial.println(val);
// value = Encoder(value);
if (value == 0) {
while (true) {
val = Encoder(val);
if (val != value) {
value = val;
lcd.clear();
break;
}
float h = dht.readHumidity(); //Измеряем влажность
float t = dht.readTemperature(); //Измеряем температуру
float hh = dht1.readHumidity(); //Измеряем влажность
float tt = dht1.readTemperature(); //Измеряем температуру
if (h != vlaga || t != temp) {
lcd.setCursor(0, 0);
lcd.print("Humidity1: "); // Выводим текст
lcd.setCursor(10, 0);
lcd.print(h);
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print("Temperature1: ");
lcd.setCursor(13, 1); // Выводим текст
lcd.print(t);
lcd.setCursor(0, 2);
lcd.print("Humidity2: ");
lcd.setCursor(11, 2); // Выводим текст
lcd.print(hh);
lcd.setCursor(0, 3); // Устанавливаем курсор в начало 2 строки
lcd.print("Temperature2: ");
lcd.setCursor(13, 3); // Выводим текст
lcd.print(tt);
}
vlaga = h;
temp = t;
}
}
//вывод данных по датчику света
if (value == -1 || value == 1) {
while (true) {
val = Encoder(val);
if (val != value) {
value = val;
lcd.clear();
break;
}
int xD0;
lcd.clear();
xD0 = digitalRead(pinD0);
// if (xD0 != svet) {
if (xD0 == HIGH) // Если xD0 равно "1"
{
lcd.setCursor(0, 0);
lcd.print("illumination ON"); // свет включен
} else {
lcd.setCursor(0, 0);
lcd.print("illumination OFF"); // свет выключен
// }
}
}
}
//Вывод данных по датчику влажности почвы
if (value == -2 || value == 2) {
while (true) {
val = Encoder(val);
if (val != value) {
value = val;
lcd.clear();
break;
}
sol = analogRead(solPin);
lcd.print("uroven_vlagi= "); // к которому подключен датчик
lcd.print(sol); // выводим в порт значение АЦП сигнала с датчика
lcd.setCursor(0, 1);
if (sol > minsol) { lcd.print("Pocva_suhaya"); }
if (sol < minsol) { lcd.print("Pocva_vlazhnaya"); }
//delay(100);
}
}
//Вывод данных по датчику газа
if (value == -3 || value == 3) {
while (true) {
val = Encoder(val);
if (val != value) {
value = val;
lcd.clear();
break;
}
int analogSensor = analogRead(smokePin); // считываем значения АЦП с аналогового входа
if (analogSensor != gaz) {
lcd.print("uroven_gaza= "); // к которому подключен датчик
lcd.print(analogSensor); // выводим в порт значение АЦП сигнала с датчика
lcd.setCursor(0, 1);
// Проверяем, достигнуто ли пороговое значение
if (analogSensor > sensorThres) { // если значение больше допустимого...
lcd.print(" Gaz!"); // выводим в порт надпись, что газ есть
} else { // иначе...
lcd.print(" normal"); // выводим в порт надпись, что газа нет
}
}
}
}
//вывод времени и даты
if (value == -4 || value == 4) {
while (true) {
val = Encoder(val);
if (val != value) {
value = val;
lcd.clear();
break;
}
lcd.print(F(" Time: Date:"));
lcd.setCursor(0, 2);
for (int i = 0; i < 5; i++) {
DateTime now = rtc.now();
sprintf(tim, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year());
lcd.setCursor(0, 2);
lcd.print(tim);
// delay(1000);
}
}
}
}
int Encoder(int value1) {
currentStateCLK = digitalRead(CLK);
// Если последнее и текущее состояние CLK различаются, то произошел импульс.
// Реагируем только на одно изменение состояния, чтобы избежать двойного счета
if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
// Если состояние DT отличается от состояния CLK, то
// энкодер вращается против часовой стрелки, поэтому уменьшаем
if (digitalRead(DT) != currentStateCLK) {
value1--;
} else {
// Энкодер вращается по часовой стрелке, поэтому увеличиваем
value1++;
}
if (value1 > 4 || value1 < -4) {
value1 = 0;
}
}
// Запоминаем последнее состояние CLK
lastStateCLK = currentStateCLK;
return value1;
}
> После добавления функции стало выскакивать исключение
>
> 3fffff40: 3ffee618 3ffee63c 41d00000 42286666
> 3fffff50: 00000000 00000000 3ffee5f0 42286666
> 3fffff60: 41d00000 3ffee63c 3ffee604 402011e1
> 3fffff70: 3fffda08 00000020 3ffee5f0 3ffee818
> 3fffff80: 3fffdad0 3ffee648 3ffee660 40201754
> 3fffff90: 422c0000 41c33333 3ffee5f0 402010aa
> 3fffffa0: 111b0417 feef2429 feefeffe 3ffee818
> 3fffffb0: 3fffdad0 00000000 3ffee7ec 40202f8c
> 3fffffc0: feefeffe feefeffe 3fffdab0 40101041
> <<<stack<<<
>
> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
> H!��1��)9;��9j$h0�Zh�
> --------------- CUT HERE FOR EXCEPTION DECODER ---------------
>
> Soft WDT reset
>
> Exception (4):
> epc1=0x4000c999 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
>
> >>>stack>>>
>
> ctx: cont
> sp: 3ffffdd0 end: 3fffffd0 offset: 0160
> 3fffff30: 00000000 7fc31999 00000004 4229999a
> 3fffff40: 3ffee618 3ffee63c 41d00000 4229999a
> 3fffff50: 00000000 00000000 3ffee5f0 4229999a
> 3fffff60: 41d00000 3ffee63c 3ffee604 402011d5
В чем причина? в Ардуино совсем новичок