RTC от makuna

flat
Offline
Зарегистрирован: 05.02.2015

Проблемма ... 

Эта бибилиотека ставит время на часах с текущего времени компьютера... но я хочу настраивать его с сотового .. не могу расковырять 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);
}

 

flat
Offline
Зарегистрирован: 05.02.2015

Мне нужен формат данных для settime.. в функции printDateTime

 

 snprintf_P(datestring,
105             countof(datestring),
106

            PSTR("%02u/%02u/%04u %02u:%02u:%02u"),

 

Не понимаю

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

flat пишет:

хочу настраивать его с сотового .. не могу расковырять settime ...

А пытался? Давай код, посмотрим.

flat
Offline
Зарегистрирован: 05.02.2015

Пока толкьо переменную 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);

}


 

flat
Offline
Зарегистрирован: 05.02.2015

Сделал напрямую через 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();//закрыли сессию
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

  /* 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);