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.
Только не "возвращайте всё назад" если вдруг Вам покажется, что не помогло. Всё, что тут написали - правильно, просто это может оказаться не единственной проблемой.