Прошу помощи по коду

allname
Offline
Зарегистрирован: 20.10.2015

Помогите пожалуйста. Составил вот код для UNO, дисплея 1602, DS3231 и DHT11, но не могу понять почему же все-таки не работает. 1602 подключен по I2C так-же как и ds3231, DHT11 на А2. Смысл такой что на дисплей выводится время (ну тобишь часы)температура и влажность с DHT11. В процессе написания кода получалось вывести всю инфу, а в итоге после всех изменений и совершенствований кода работать перестало. Прошу помощи и не судить строго, т.к. еще начинающий )))))) заранее спасибо всем

#include <DHT.h>
#define DHTPIN A2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);


#include <DS3231.h>
#include <Wire.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;

void setup () {
        Clock.setSecond(00);//Set the second 
        Clock.setMinute(40);//Set the minute 
        Clock.setHour(21);  //Set the hour 
        Clock.setDoW(2);    //Set the day of the week
        Clock.setDate(20);  //Set the date of the month
        Clock.setMonth(10);  //Set the month of the year
        Clock.setYear(15);  //Set the year (Last two digits of the year)
  dht.begin();
  lcd.init(); 
  lcd.backlight(); 

  lcd.begin(16, 2);
 
  lcd.clear();

  Wire.begin();
  
Wire.beginTransmission(0x68);
Wire.write(0x07);
Wire.write(0x10); 
Wire.endTransmission();

  }

void ReadDS3231()
{
   int second,minute,hour,date,month,year,temperature; 
  second=Clock.getSecond();
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
  date=Clock.getDate();
  month=Clock.getMonth(Century);
  year=Clock.getYear();
}
void loop () {ReadDS3231();
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  
   lcd.setCursor(1, 0);
   //lcd.print(Clock.getYear(), DEC);
   //lcd.print('-');
   //lcd.print(Clock.getMonth(Century), DEC);
   //lcd.print('-');
   //lcd.print(Clock.getDate(), DEC);
   //lcd.print(' ');
   //lcd.print(Clock.getDoW(), DEC);
    //lcd.print(' ');
  // Finally the hour, minute, and second
  lcd.print(Clock.getHour(h12, PM), DEC);
  lcd.print(':');
  lcd.print(Clock.getMinute(), DEC);
  lcd.print(':');
  lcd.print(Clock.getSecond(), DEC);
  // Add AM/PM indicator
  if (h12) {
    if (PM) {
      lcd.print(" PM ");
    } else {
     lcd.print(" AM ");
    }
  } else {
    lcd.print(" 24h ");
    
   lcd.setCursor(12, 0);
   lcd.print(t);
   lcd.write(0b11011111);
   lcd.print("C");
  
   
   lcd.setCursor(12, 1);
   lcd.print(h);
   lcd.print("%u");
}
}


 P.S. Первый мой пост тут, может что не так сделал, заранее извиняюсь, обещаю исправиться.

Radjah
Offline
Зарегистрирован: 06.08.2014

Для начала в IDE нажми Ctrl+T, чтобы код нормально отфарматировался.

18 и 47 строки. ReadDS3231 пишет в локальные переменные, которые уничтожаются при выходе из функции.

Не вижу выдержки для DHT11. Он чаще раза в секунду данные выдавать не может.

Прочитай про printf и sprintf, чтобы не загоняться с нулями.

Вообще, для часов очень рекомендую https://github.com/adafruit/RTClib

allname
Offline
Зарегистрирован: 20.10.2015

Radjah пишет:

18 и 47 строки. ReadDS3231 пишет в локальные переменные, которые уничтожаются при выходе из функции.

А что с этим делать??? Поясните пожалуйста.

Radjah пишет:

Не вижу выдержки для DHT11. Он чаще раза в секунду данные выдавать не может.

поставил задержку

 lcd.setCursor(12, 1);
    lcd.print(h);
    lcd.print("%u");
    delay, (1000);
  }
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

> А что с этим делать?

Убрать объявление локальных переменных же.

allname
Offline
Зарегистрирован: 20.10.2015

Ладно, спасибо, буду пробовать.

allname
Offline
Зарегистрирован: 20.10.2015

Подредактировал, упростил, проверить пока не могу, но IDE при компиляции не ругается.

#include "DHT.h"
#define DHTPIN A2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
DS3231  rtc(SDA, SCL);
Time time;
void setup () {
  dht.begin();
  rtc.begin();
  lcd.init();
  lcd.backlight();
  lcd.begin(16, 2);
  lcd.clear();
  Wire.begin();
  Wire.beginTransmission(0x68);
  Wire.write(0x07);
  Wire.write(0x10);
  Wire.endTransmission();
  time = rtc.getTime();
}

void loop () {
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  lcd.setCursor(1, 0);
  lcd.print(rtc.getTimeStr(FORMAT_LONG));
  lcd.setCursor(1, 1);
  lcd.print(t);
  lcd.write(0b11011111);
  lcd.print("C");
  lcd.setCursor(6, 1);
  lcd.print(h);
  lcd.print("%u");
  delay, (1000);
}

На Ваш взгляд как, корректно???

Убрал часть кода

Clock.setSecond(00);//Set the second 
Clock.setMinute(40);//Set the minute 
Clock.setHour(21);  //Set the hour 
Clock.setDoW(2);    //Set the day of the week
Clock.setDate(20);  //Set the date of the month
Clock.setMonth(10);  //Set the month of the year
Clock.setYear(15);  //Set the year (Last two digits of the year)

наверно из-за этого он у меня после отключения питания на дуине и очередного включения показывал не текущее время, а то, которое было при выключении???

Radjah
Offline
Зарегистрирован: 06.08.2014

В 38 строке лишняя запятая.

allname
Offline
Зарегистрирован: 20.10.2015

Ага, спасибо, поправил. А все остальное грамотно???

Radjah
Offline
Зарегистрирован: 06.08.2014

Я бы сделал с форматированием, чтобы при переходе у меньшении/увеличении количества разрдяов в градусах артефактов не было.

allname
Offline
Зарегистрирован: 20.10.2015

Ладно, спасибо за помощь и за советы. Вечером проверю как работает, если что позволю себе обратиться снова за помощью.

allname
Offline
Зарегистрирован: 20.10.2015

Все отлично работает )))) еще раз спасибо за помощь