ds3231 не запоминают время
- Войдите на сайт для отправки комментариев
Пнд, 08/10/2018 - 13:59
ds3231 не запоминают время, при каждом включении отображается время при котором я залил прошивку в ардуино.
Модуль менял, батарейку тоже менял.
#include <TimeAlarms.h> #include <Time.h> #include <TimeLib.h> #include <DHT.h> #include <Wire.h> #include <DS3231.h> #include <LiquidCrystal_I2C.h> #define DHTPIN 12 #define DHTTYPE DHT22 #define soketD2Tup 2 #define soketD3Tdown 3 #define soketD4Hup 4 #define soketD5Hdown 5 DHT dht(DHTPIN, DHTTYPE); float tem = 0; float hum = 0; DS3231 clock; RTCDateTime dt; LiquidCrystal_I2C lcd(0x27, 16, 2); byte degree[8] = { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; void setup() { Serial.begin(9600); lcd.begin(); lcd.backlight(); lcd.createChar(5, degree); Serial.println("LCD1602"); clock.begin(); Serial.println("DS3231"); dht.begin(); Serial.println("DHT22"); clock.setDateTime(__DATE__, __TIME__); THsetup(); delay(1000); } void THsetup() { pinMode(soketD2Tup, OUTPUT); pinMode(soketD3Tdown, OUTPUT); pinMode(soketD4Hup, OUTPUT); pinMode(soketD5Hdown, OUTPUT); digitalWrite(soketD2Tup, 1); digitalWrite(soketD3Tdown, 1); digitalWrite(soketD4Hup, 1); digitalWrite(soketD5Hdown, 1); } void loop() { tem = dht.readTemperature(); hum = dht.readHumidity(); dt = clock.getDateTime(); Serial.println(clock.dateFormat("d M h:i A", dt)); Serial.println(tem, 1); Serial.println(hum, 0); Tup(); Tdown(); Hup(); Hdown(); lcdprint(); delay(1000); } void lcdprint() { lcd.setCursor(0, 0); lcd.print(tem, 1); lcd.setCursor(4, 0); lcd.write((byte)5); lcd.setCursor(0, 1); lcd.print(hum, 0); lcd.setCursor(2, 1); lcd.print("%"); lcd.setCursor(10, 0); lcd.print(clock.dateFormat("d M", dt)); lcd.setCursor(10, 1); lcd.print(clock.dateFormat("H:i", dt)); if ((dt.hour >= 16) || (dt.hour >= 0) && (dt.hour < 10)) { lcd.setCursor(6, 0); lcd.print("Day"); } else { lcd.setCursor(4, 1); lcd.print("Night"); } } void Tup() { if ((tem >= 26.0) && ((dt.hour >= 16) || (dt.hour >= 0) && (dt.hour < 10))) { digitalWrite(soketD2Tup, 1); Serial.println("heater off"); } if ((tem >= 25.0) && ((dt.hour >= 16) || (dt.hour >= 0) && (dt.hour < 10))) { digitalWrite(soketD2Tup, 0); Serial.println("heater on"); } if ((tem >= 21.0) && (dt.hour >= 10) && (dt.hour < 16)) { digitalWrite(soketD2Tup, 1); Serial.println("heater off"); } if ((tem <= 20.0) && (dt.hour >= 10) && (dt.hour < 16)) { digitalWrite(soketD2Tup, 0); Serial.println("heater on"); } } void Tdown() { if ((tem >= 27.0) && ((dt.hour >= 16) || (dt.hour >= 0) && (dt.hour < 10))) { digitalWrite(soketD3Tdown, 0); Serial.println("fan on"); } if ((tem >= 26.0) && ((dt.hour >= 16) || (dt.hour >= 0) && (dt.hour < 10))) { digitalWrite(soketD3Tdown, 1); Serial.println("fan off"); } if ((tem >= 22.0) && (dt.hour >= 10) && (dt.hour < 16)) { digitalWrite(soketD3Tdown, 0); Serial.println("fan on"); } if ((tem <= 21.0) && (dt.hour >= 10) && (dt.hour < 16)) { digitalWrite(soketD3Tdown, 1); Serial.println("fan off"); } } void Hup() { if (hum >= 60.0) { digitalWrite(soketD4Hup, 1); Serial.println("humidifier off"); } if (hum <= 50.0) { digitalWrite(soketD4Hup, 0); Serial.println("humidifier on"); } } void Hdown() { if (hum >= 50.0) { digitalWrite(soketD5Hdown, 0); Serial.println("dehydrator on"); } if (hum <= 40.0) { digitalWrite(soketD5Hdown, 1); Serial.println("dehydrator off"); } }
Вот это ни о чем не говорит:
clock.setDateTime(__DATE__, __TIME__);
?Эта команда устанавливает время, которое на компьюторе в часы, что с ней не так?
Эта команда устанавливает время, которое на компьюторе в часы, что с ней не так?
нет, она каждый раз устанавливает время на время. "когда вы залили прошивку в ардуино"
Да с ней-то все так. Вопрос к вам - чего вы ожидаете, каждый раз при включении устанавливая одно и то же время и дату?
Я не заливаю прошивку каждый раз, вообще-то
Я включаю с блока питания и каждый раз одно и то же вермя - время когда я залил прошивку :\
Ожидаю, что она установит мне время и дальше когда я буду включать напрямую через блок питания у меня будет идти время с того момента
Я включаю с блока питания и каждый раз одно и то же вермя - время когда я залил прошивку :\
ну все верно - так и должно быть с этой командой
Вас понял, действительно так
Ожидаю, что она установит мне время и дальше когда я буду включать напрямую через блок питания у меня будет идти время с того момента
Похоже, вы не въезжаете.
Эта команда аналогична тому, что если б вы написали в скетче "Каждый раз при включении устанавливать дату 1 января". Если включить ардуину 1 января - это будет верно, но когда вы ее включите второго - на ней снова будет первое...
Так понятно?
Ожидаю, что она установит мне время и дальше когда я буду включать напрямую через блок питания у меня будет идти время с того момента
Она так и делает - устанавливает время компиляции каждый раз, когда ее вызывают. Вас же не удивляет, надеюсь, тот факт, что при каждом включении выполняется
Serial
.println(
"LCD1602"
);
?Залейте прошивку с ней, потом закомментируйте установку времени и залейте еще раз.
Именно. Прошивка устанавливает время компиляции. После первого запуска надо загрузить прошивку с закомментированной строкой 48.
Только не "возвращайте всё назад" если вдруг Вам покажется, что не помогло. Всё, что тут написали - правильно, просто это может оказаться не единственной проблемой.