Помогите с отладкой кода

Это НЕ мой код; был опубликован в 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
 */

, 👍1


1 ответ


Лучший ответ:

2

Вы установили библиотеку Adafruit DHT через менеджер библиотек Arduino

Библиотека Adafruit

Исходный код не работает с этой библиотекой. Он написан для использования библиотеки DHT, написанной Робом Тиллаартом и названной DHTLib. Эта библиотека не включена в диспетчер библиотек Arduino IDE. Вместо этого вам нужно скачать библиотеку в виде ZIP-файла и установить ее через Sketch/Include Library/Add .ZIP library.

Как установить

Я не знаю, почему вы тем временем изменили исходный код. Использование DHTLib с исходным кодом редакции 1 вашего вопроса работает нормально. В то же время вы пытались адаптировать код, чтобы он соответствовал библиотеке Adafruit, что в конечном итоге может быть в порядке после некоторой тяжелой работы. Предлагаю откатиться на код ревизии 1 и установить правильную библиотеку.

,

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](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