RTC от makuna
- Войдите на сайт для отправки комментариев
Пт, 01/06/2018 - 21:17
Проблемма ...
Эта бибилиотека ставит время на часах с текущего времени компьютера... но я хочу настраивать его с сотового .. не могу расковырять settime ...
код из примера
// CONNECTIONS:
// DS1307 SDA --> SDA
// DS1307 SCL --> SCL
// DS1307 VCC --> 5v
// DS1307 GND --> GND
/* for software wire use below
#include <SoftwareWire.h> // must be included here so that Arduino library object file references work
#include <RtcDS1307.h>
SoftwareWire myWire(SDA, SCL);
RtcDS1307<SoftwareWire> Rtc(myWire);
for software wire use above */
/* for normal hardware wire use below */
#include <Wire.h> // must be included here so that Arduino library object file references work
#include <RtcDS1307.h>
RtcDS1307<TwoWire> Rtc(Wire);
/* for normal hardware wire use above */
void setup ()
{
Serial.begin(57600);
Serial.print("compiled: ");
Serial.print(__DATE__);
Serial.println(__TIME__);
//--------RTC SETUP ------------
// if you are using ESP-01 then uncomment the line below to reset the pins to
// the available pins for SDA, SCL
// Wire.begin(0, 2); // due to limited pins, use pin 0 and 2 for SDA, SCL
Rtc.Begin();
RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
printDateTime(compiled);
Serial.println();
if (!Rtc.IsDateTimeValid())
{
// Common Cuases:
// 1) first time you ran and the device wasn't running yet
// 2) the battery on the device is low or even missing
Serial.println("RTC lost confidence in the DateTime!");
// following line sets the RTC to the date & time this sketch was compiled
// it will also reset the valid flag internally unless the Rtc device is
// having an issue
Rtc.SetDateTime(compiled);
}
if (!Rtc.GetIsRunning())
{
Serial.println("RTC was not actively running, starting now");
Rtc.SetIsRunning(true);
}
RtcDateTime now = Rtc.GetDateTime();
if (now < compiled)
{
Serial.println("RTC is older than compile time! (Updating DateTime)");
Rtc.SetDateTime(compiled);
}
else if (now > compiled)
{
Serial.println("RTC is newer than compile time. (this is expected)");
}
else if (now == compiled)
{
Serial.println("RTC is the same as compile time! (not expected but all is fine)");
}
// never assume the Rtc was last configured by you, so
// just clear them to your needed state
Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low);
}
void loop ()
{
if (!Rtc.IsDateTimeValid())
{
// Common Cuases:
// 1) the battery on the device is low or even missing and the power line was disconnected
Serial.println("RTC lost confidence in the DateTime!");
}
RtcDateTime now = Rtc.GetDateTime();
printDateTime(now);
Serial.println();
delay(10000); // ten seconds
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
void printDateTime(const RtcDateTime& dt)
{
char datestring[20];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
}
Мне нужен формат данных для settime.. в функции printDateTime
snprintf_P(datestring,105countof(datestring),106PSTR("%02u/%02u/%04u %02u:%02u:%02u"),Не понимаю
хочу настраивать его с сотового .. не могу расковырять settime ...
А пытался? Давай код, посмотрим.
Пока толкьо переменную compiled вывожу в сериал... ахинею какюто дает ... Но по gettime норм время получаю.
#include <Wire.h> #include <RtcDateTime.h> #include <RtcDS1307.h> #include <RtcDS3231.h> #include <RtcTemperature.h> #include <RtcUtility.h> #include <MQTT.h> // Подключаем библиотеку для работы протоколом MQTT #include <PubSubClient.h> // Подключаем библиотеку для получения и публикации топиков от/на брокере #include <ESP8266WiFi.h> // Подключаем библиотеку для работы с WiFi //const char *ssid = ""; // Имя вайфай точки доступа //const char *pass = ""; // Пароль от точки доступа const char *ssid = ""; // Имя вайфай точки доступа const char *pass = ""; // Пароль от точки доступа const char *mqtt_server = ".by"; // Имя сервера MQTT const int mqtt_port = 1883; // Порт для подключения к серверу MQTT const char *mqtt_user = ""; const char *mqtt_pass = ""; WiFiClient wclient; // создаем обьект клиента Wifi PubSubClient client(wclient, mqtt_server, mqtt_port); // создаем обьект клиента MQTT RtcDS3231<TwoWire> Rtc(Wire); #define BUFFER_SIZE 100 int tm, temp; int svetonoff, svetr1, svetb1, svetw1; int sethour, setmin, setday, setdayw, setmonth, setyear, setsave; void setup() { pinMode (D7, OUTPUT); //Красное свечение pinMode (D3, OUTPUT); //Синие свечение pinMode (D8, OUTPUT); //Белое свечение Rtc.Begin(); Serial.begin(9600); // Внимание !!!! при просмотре com порта выставьте скорость 115200 WiFi.begin(ssid, pass); reconnectwifi(); reconnectmqtt(); } void loop() { if (!client.connected()) { // переподключаемся к MQTT серверу if (WiFi.status() != WL_CONNECTED) { // reconnectwifi(); } else { reconnectmqtt(); } } if (client.connected()) { client.loop(); delay(100); //TempSend(); //svetdiapf(); /* RtcDateTime now = Rtc.GetDateTime(); Serial.print(now.Hour()); Serial.print(now.Minute()); Serial.println(now.Second());*/ RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__); Serial.println(compiled); } } // Функция отправки показаний с термодатчика void TempSend() { if (tm == 0) { temp = 2; client.publish("/Home/temp", String(temp)); // отправляем в топик для термодатчика значение температуры //Serial.println(temp); tm = 300; // пауза между отправками значений температуры коло 3 секунд } tm--; delay(10); } void callback(const MQTT::Publish & pub) { Serial.print(pub.topic()); // выводим в сериал порт название топика Serial.print(" => "); Serial.println(pub.payload_string()); // выводим в сериал порт значение полученных данных String payload = pub.payload_string(); if (String(pub.topic()) == "/user/flat/SvetOnOff") // проверяем из нужного ли нам топика пришли данные { svetonoff = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(svetonoff); if (svetonoff == 1) { sveton(); } else { svetoff(); } } if (String(pub.topic()) == "/user/flat/SvetR1") // проверяем из нужного ли нам топика пришли данные { svetr1 = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(svetr1); if (svetonoff == 1) { Serial.println("nen"); sveton(); } } if (String(pub.topic()) == "/user/flat/SvetB1") // проверяем из нужного ли нам топика пришли данные { svetb1 = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(svetb1); if (svetonoff == 1) { sveton(); } } if (String(pub.topic()) == "/user/flat/SvetW1") // проверяем из нужного ли нам топика пришли данные { svetw1 = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(svetw1); if (svetonoff == 1) { sveton(); } } if (String(pub.topic()) == "/user/flat/sethour") // проверяем из нужного ли нам топика пришли данные { sethour = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(sethour); } if (String(pub.topic()) == "/user/flat/setmin") // проверяем из нужного ли нам топика пришли данные { setmin = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(setmin); } if (String(pub.topic()) == "/user/flat/setday") // проверяем из нужного ли нам топика пришли данные { setday = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(setday); } if (String(pub.topic()) == "/user/flat/setdayw") // проверяем из нужного ли нам топика пришли данные { setdayw = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(setdayw); } if (String(pub.topic()) == "/user/flat/setmonth") // проверяем из нужного ли нам топика пришли данные { setmonth = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(setmonth); } if (String(pub.topic()) == "/user/flat/setyear") // проверяем из нужного ли нам топика пришли данные { setyear = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(setyear); } if (String(pub.topic()) == "/user/flat/setsave") // проверяем из нужного ли нам топика пришли данные { setsave = payload.toInt(); // преобразуем полученные данные в тип integer Serial.println(setsave); } } void reconnectmqtt() { if (WiFi.status() == WL_CONNECTED) { // если вафля подключена if (!client.connected()) { // подключаемся к MQTT серверу Serial.println("Connecting to MQTT server"); if (client.connect(MQTT::Connect("arduinoClient2").set_auth(mqtt_user, mqtt_pass))) { Serial.println("Connected"); client.set_callback(callback); client.subscribe("/user/flat/SvetOnOff"); // Включить свет client.subscribe("/user/flat/SvetR1"); // Яркость красного 1 включение. client.subscribe("/user/flat/SvetB1"); // Яркость синего 1 включение. client.subscribe("/user/flat/SvetW1"); // Яркость белого 1 включение. client.subscribe("/user/flat/sethour"); //Установка времени client.subscribe("/user/flat/setmin"); client.subscribe("/user/flat/setday"); client.subscribe("/user/flat/setdayw"); client.subscribe("/user/flat/setmonth"); client.subscribe("/user/flat/setyear"); client.subscribe("/user/flat/setsave"); } else { Serial.println("Connection failed"); } } } } void reconnectwifi() { if (WiFi.status() != WL_CONNECTED) { // подключаемся к WIFI Serial.print("Connecting к WiFi SSID: "); Serial.print(ssid); Serial.println("..."); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi connected"); Serial.print ("IP: "); Serial.println(WiFi.localIP());//получаем IP WeMos, этот IP необходимо ввести в адресной строке браузера, чтобы получить доступ к WeMos /*Serial.print ("MAC: "); Serial.println(WiFi.macAddress()); //получаем MAC-адрес WeMos Serial.print ("Mask: "); Serial.println(WiFi.subnetMask()); //маску подсети Serial.print ("Gateway: "); Serial.println(WiFi.gatewayIP()); //IP- шлюза Serial.print ("SSID: "); Serial.println(WiFi.SSID());// имя сети, к которой подключен WeMos Serial.print ("Signal level: "); Serial.println(WiFi.RSSI()); //и уровень сигнала*/ } } void sveton() { analogWrite (D7, svetr1); analogWrite (D3, svetb1); analogWrite (D8, svetw1); } void svetoff() { analogWrite (D7, LOW); analogWrite (D3, LOW); analogWrite (D8, LOW); }Сделал напрямую через wire
void setDate() { Wire.beginTransmission(DS3231_I2C_ADDRESS); //начали сессию Wire.write(0x00); //поставляемся в нулевой байт для чтения данных Wire.write(decToBcd(0x00));// секунды Wire.write(decToBcd(setmin)); //минуты Wire.write(decToBcd(sethour));// часы Wire.write(decToBcd(setdayw));// день недели Wire.write(decToBcd(setday)); // число Wire.write(decToBcd(setmonth)); // месяц Wire.write(decToBcd(setyear - 2000)); // год Wire.endTransmission();//закрыли сессию }/* Sample: RtcDateTime manual = RtcDateTime("Jan 25 2017", "16:30:00"); // минуты и секунды двузначные! Rtc.SetDateTime(manual); */ char userTime[8]; // формирование строки времени в формате ЧЧ:ММ:СС userTime[0] = hh / 10 + '0'; userTime[1] = hh % 10 + '0'; userTime[2] = ':'; userTime[3] = mm / 10 + '0'; userTime[4] = mm % 10 + '0'; userTime[5] = ':'; userTime[6] = '0'; userTime[7] = '0'; RtcDateTime manual = RtcDateTime(__DATE__, userTime); Rtc.SetDateTime(manual);