Помогите с отладкой кода
Это НЕ мой код; был опубликован в Project Hub. Я пытался использовать код (регулятор влажности), но он возвращает ошибку в строке 270:
else if (DHT.humidity >= setpoint + 3 and syson == true) { //если влажность на 3% выше заданного значения
Ошибка: ожидаемое основное выражение перед '.' токен
ОП не отвечает на комментарии, а я не эксперт. Был бы признателен, если бы кто-нибудь помог отладить код; Спасибо!
//РЕГУЛЯТОР ВЛАЖНОСТИ 1.1
//написано для НАНО
//управляет и отображает относительную влажность
//используемый датчик - DHT11
//использует релейный модуль с активным низким уровнем для управления линиями под напряжением для 2 стандартных электрических розеток
//использует ЖК-дисплей i2c для отображения влажности и настроек влажности
//выключает дисплей во время бездействия
//настройка регулируется от 10% до 90% с помощью 2 кнопок
//подсветка ЖК-дисплея управляется контактом 4, подключенным к верхнему контакту светодиодной перемычки на рюкзаке i2c
// последовательная связь для мониторинга, чтобы убедиться, что весь код работает.
//добавлено: функция "отключение системы" - позволяет отключить обе розетки
// █ Г █ Л █ О █ Б █ А █ Л █ С █
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <dht.h>
// установить адрес ЖК-дисплея на 0x27 для 16-символьного и 2-строчного дисплея
LiquidCrystal_I2C lcd(0x27, 16, 2);
dht DHT;
#define DHT11_PIN A2
//кнопки и переменные для настройки калибровки
int calupbtn = A0;
int calup;
int caldownbtn = A1;
int caldown;
// i2c PINS A4, A5
//пин для включения реле увлажнителя
int humidifier = 3;
//пин для включения реле вентилятора
int fan = 2;
//pin для включения подсветки LCD
int lcdlight = 4;
//калибровочная переменная
int setpoint = 50; //уставка обратной связи.
bool calstate = false; //включает настройку калибровки только при включенном ЖК-дисплее.
// переменные времени подсветки
int displtime = 12000; //количество времени, которое дисплей должен быть включен перед выключением
unsigned long displtimeon; // Таймер отображения последнего записанного времени был сброшен
int calunlock = 0; //счетчик циклов для разблокировки калибровки
// временные переменные датчика
unsigned long lastcheck; //последнее чтение DHT
long interval = 30000; //время между показаниями DHT
//системные переменные
bool syson = true; //ссылка на включение/выключение системы.
byte systog = 2; //четное число включается, шансы выключаются
int syslock = 0; //счетчик цикла для разблокировки системного переключателя
// █ S █ E █ T █ U █ P █ + █ + █ + █ + █ + █ + █ + █ + █ + █ + █ + █ + █ + █ + █
void setup(){
Serial.begin(9600); //последовательная связь, используемая для обеспечения правильной работы кода.
lcd.init(); // инициализируем ЖК-дисплей
lcd.backlight(); // включаем подсветку LCD, но не включаем
lastcheck = 0;
digitalWrite(lcdlight, HIGH);
Serial.println("STARTING");
lcd.print(" STARTING");
//назначения контактов
pinMode(calupbtn, INPUT);
pinMode(caldownbtn, INPUT);
pinMode(humidifier, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(lcdlight, OUTPUT);
delay(1000);
// тестовый вентилятор
lcd.setCursor(0,1);
lcd.print("<FAN> HMDFR ");
digitalWrite(fan, LOW);
digitalWrite(humidifier, HIGH);
delay(6000);
//проверка увлажнителя
lcd.setCursor(0,1);
lcd.print(" FAN <HMDFR> ");
digitalWrite(fan, HIGH);
digitalWrite(humidifier, LOW);
delay(6000);
//остановить тест запуска
digitalWrite(humidifier, HIGH);
digitalWrite(fan, HIGH);
lcd.clear();
displtimeon = millis();
int chk = DHT.read11(DHT11_PIN);
lastcheck = millis();
lcd.setCursor(0,0);
lcd.print("Humidity: ");
lcd.setCursor(13,0);
lcd.print(DHT.humidity);
lcd.setCursor(15,0);
lcd.print("% ");
lcd.setCursor(0,1);
lcd.print("setting: ");
lcd.setCursor(13,1);
lcd.print(setpoint);
lcd.setCursor(15,1);
lcd.print("% ");
delay(100);
}
// █ L █ O █ O █ P █ = █ = █ = █ = █ = █ = █ = █ = █ = █ = █ = █ = █ = █ = █ = █
void loop(){
//проверить кнопки калибровки
calup = digitalRead(calupbtn);
caldown = digitalRead(caldownbtn);
if(calup == HIGH and caldown == HIGH){ //--------ПЕРЕКЛЮЧЕНИЕ СИСТЕМЫ
syslock ++;
Serial.println(syslock);
if(syslock == 20){ //если обе кнопки удерживаются столько раз
systog++;
if(systog % 2 == 1){ //--------СИСТЕМА ВЫКЛЮЧЕНА
syson = false;
digitalWrite(fan, HIGH);
digitalWrite(humidifier, HIGH);
digitalWrite(lcdlight, HIGH);
Serial.println("SYSTEM TURNED OFF");
lcd.clear();
lcd.print(" SYSTEM OFF");
lcd.setCursor(0,1);
lcd.print(" hold both btns");
delay(2000);
lcd.setCursor(0,1);
lcd.print(" to turn on ");
displtimeon = millis();
}
if(systog % 2 == 0){ //--------СИСТЕМА ВКЛЮЧЕНА
syson = true;
Serial.println("SYSTEM TURNED ON");
digitalWrite(lcdlight, HIGH);
lcd.clear();
lcd.print(" SYSTEM ON");
delay(2000);
lcd.clear();
displtimeon = millis();
}
syslock = 0;
}
}
else(syslock = 0);
//читаем влажность через соответствующие промежутки времени
if(millis() > lastcheck + interval and syson == true){ //считываем влажность DHT
int chk = DHT.read11(DHT11_PIN);
lastcheck = millis();
Serial.print("DHT read = ");
Serial.print(DHT.humidity);
Serial.print("%");
Serial.println(" ");
}
//включаем светодиоды при нажатии кнопок калибровки
if(calup == HIGH xor caldown == HIGH){
digitalWrite(lcdlight, HIGH);
calstate = true;
displtimeon = millis(); // устанавливаем таймер отображения
Serial.println("cal btn ACTIVE");
if(syson == false){
digitalWrite(lcdlight, HIGH);
lcd.clear();
lcd.print(" SYSTEM OFF");
lcd.setCursor(0,1);
lcd.print(" hold both btns");
delay(3000);
lcd.setCursor(0,1);
lcd.print(" to turn on ");
displtimeon = millis();
}
}
if(calstate == true and syson == true){ //--------ПРОГРАММА ОТОБРАЖЕНИЯ
Serial.println("printing display");
//отображение переменных на ЖК-дисплее
lcd.setCursor(0,0);
lcd.print("Humidity: ");
lcd.setCursor(13,0);
lcd.print(DHT.humidity);
lcd.setCursor(15,0);
lcd.print("% ");
lcd.setCursor(0,1);
lcd.print("setting: ");
lcd.setCursor(13,1);
lcd.print(setpoint);
lcd.setCursor(15,1);
lcd.print("% ");
delay(100);
calunlock ++;
//сохраняет калибровку заблокированной до тех пор, пока дисплей не будет циклически повторяться 5 раз после первоначального включения
//предотвращает корректировку при первоначальном нажатии кнопки.
}
//--------НАСТРОЙКИ КАЛИБРОВКИ
if(calup == HIGH and caldown == LOW and calstate == true and syson == true){
if(setpoint < 90 and calunlock > 5){
setpoint = setpoint + 5; //увеличить уставку
Serial.println("adj setpoint up");
}
Serial.println(setpoint);
delay(100);
displtimeon = millis(); //сброс таймаута подсветки
}
if(caldown == HIGH and calup == LOW and calstate == true and syson == true){
if(setpoint > 10 and calunlock > 5){
setpoint = setpoint - 5; //уменьшить уставку
Serial.println("adj setpoint dn");
}
Serial.println(setpoint);
delay(100);
displtimeon = millis(); //сброс таймаута подсветки
}
if(millis() > displtimeon + displtime){ //-----------------ВРЕМЯ ПОДСВЕТКИ
digitalWrite(lcdlight, LOW); //выключить экран
calstate = false;
Serial.println("displ + backlights off");
lcd.clear();
calunlock = 0; //блокировка калибровки
}
if(millis() < lastcheck){
lastcheck = millis(); //сбрасываем таймеры при прокрутке миллисекунды
}
//--------ПРОЦЕДУРА ОШИБКИ УСТАВКИ
if(setpoint > 91 or setpoint < 9){ //если заданное значение выходит за пределы
Serial.println("O/B ERROR");
digitalWrite(lcdlight, HIGH);
lcd.clear();
lcd.print("O/B ERROR"); // отображаем сообщение об ошибке на ЖК-дисплее
lcd.setCursor(0,1);
lcd.print("RESETTING");
delay(1000);
for(int count = 9; count >= 0; count = count - 1){
lcd.setCursor(15,1);
lcd.print(count); // обратный отсчет от 10
delay(1000);
}
setpoint = 50; // сбросить уставку на 50.
displtimeon = millis();
}
//включаем реле увлажнителя, если оно ниже заданного значения --------УПРАВЛЕНИЕ РЕЛЕ
//МОДУЛЬ РЕЛЕ АКТИВЕН НИЗКИЙ
if(DHT.humidity <= setpoint - 3 and syson == true){ //если влажность на 3% ниже заданного значения
Serial.println("humidifier ON, fan OFF");
digitalWrite(humidifier, LOW); //включаем увлажнитель
digitalWrite(fan, HIGH);
}
else if(DHT.humidity >= setpoint + 3 and syson == true){ //если влажность на 3% выше заданного значения
Serial.println("humidifier OFF, fan ON");
digitalWrite(humidifier, HIGH); // включаем вентилятор
digitalWrite(fan, LOW);
}
else{
Serial.println("all off"); //если влажность в пределах 3% от заданного значения
digitalWrite(humidifier, HIGH); //выключаем оба
digitalWrite(fan, HIGH);
}
// задержка (700); //раскомментировать для последовательной отладки
Serial.print("setpoint = ");
Serial.println(setpoint);
// задержка (700); //раскомментировать для последовательной отладки
}
/* WIRING DIAGRAMS
https://66.media.tumblr.com/98426b566744beacdd42bc0221092b76/tumblr_pvr0u8kvZy1yrmjh9o1_1280.png
*/
@kwhunter, 👍1
1 ответ
Лучший ответ:
Вы установили библиотеку Adafruit DHT через менеджер библиотек Arduino
Исходный код не работает с этой библиотекой. Он написан для использования библиотеки DHT, написанной Робом Тиллаартом и названной DHTLib. Эта библиотека не включена в диспетчер библиотек Arduino IDE. Вместо этого вам нужно скачать библиотеку в виде ZIP-файла и установить ее через Sketch/Include Library/Add .ZIP library.
Я не знаю, почему вы тем временем изменили исходный код. Использование DHTLib с исходным кодом редакции 1 вашего вопроса работает нормально. В то же время вы пытались адаптировать код, чтобы он соответствовал библиотеке Adafruit, что в конечном итоге может быть в порядке после некоторой тяжелой работы. Предлагаю откатиться на код ревизии 1 и установить правильную библиотеку.
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Поддерживают ли чипы ATMega 328/2560 JTAG-программатор и аппаратный отладчик?
- Proteus - Как отладить недопустимый код операции?
- Мой код кажется крушением поезда
- Как выполнить отладку на чипе с помощью Arduino?
- Использование последовательного плоттера с Visual Studio Code
- Простой ЖК-таймер обратного отсчета
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/104070/discussion-on-answer-by-thomas-weller-help-with-debugging-code)., @VE7JRO
Да, я прямо здесь: http://www.mapability.com/ei8ic/maps/prefix/canw.php, и я вижу, что вы являетесь членом Amateur Radio SE. В не связанной с этим заметке +1 за ваш ответ. Используемые изображения четкие и легко читаемые. 73., @VE7JRO