RTC + AMS

Модератор: Alex

pvvup
Сообщения: 4
Зарегистрирован: Чт окт 15, 2020 8:57 am
Благодарил (а): 5 раз
Поблагодарили: 0

Re: RTC + AMS

Сообщение pvvup » Чт окт 15, 2020 9:31 am

Приветствую,
С позиции "чайника" можно вопрос задать. :shock:
Попробовал три варианта АМС: для Рободина (MEGA + ESP, ESP со Spiff и ESP с SD).
Что правда, всё это на IDE 1.8.13, на рекомендованную 1.6.5 перейти не смог - тупо не запускается. :mrgreen:
Пробовал 1.8.5 и пр. эффект компиляции тот же.
Самый рабочий вариант получился на Рободине.
Подкорректировал библиотеки и скетч под 1.8.13, удалось запустить ESP ху с NTP и подключением к сети, в Меге (без езернет шилда) тоже время RTC, датчик температуры и SD.
Короче, сейчас в сериал выводится Время с NTP ESP , Время с RTC Меги, но они не совпадают. Температура с датчика. Ну и при старте системы показывает состояние СД карты.
По ВайФаю иногда пишет "Нет файлов", но в основном "нет соединения" хотя IPшник в сети наличествует.
Поставил пока перед собой задачу синхронизировать время NTP c ESP с RTCом Меги и вот не могу понять:КАК это сделать? :lol:
Где ей вставить команду подхватить время с Serial3 и самое смешное - КАКУЮ?
Пытался на NodeMCU RTCку запустить, иногда получается получить с неё время, но скетчи с установкой времени не работают. :o
serghei
Сообщения: 2561
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 297 раз
Поблагодарили: 281 раз

Re: RTC + AMS

Сообщение serghei » Чт окт 15, 2020 9:59 am

Время берётся с есп8266 и передается в Мегу. Плата от robotdyn. На самой плате у есп 4 мегабайта памяти. По остальным двум сериалам можно забирать данные с других серверов или гейтов. Код покажу вечером.
СпойлерПоказать
IMG_20201015_095357_146.jpg
IMG_20201015_095357_146.jpg (102.76 КБ) 700 просмотров
За это сообщение автора serghei поблагодарил:
pvvup (Чт окт 15, 2020 10:16 am)
Рейтинг: 1.22%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
serghei
Сообщения: 2561
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 297 раз
Поблагодарили: 281 раз

Re: RTC + AMS

Сообщение serghei » Чт окт 15, 2020 11:02 pm

Приветствую Всех. За основу кода взята версия для платы RobotDyn , и правильнее было бы писать в соответствующей ветке.
Во первых , код нормально компилится в 1.8.5 без всяких правок. Очень подробно механизм взаимодействия двух серверов расписан Тут.
Я совсем не умею программировать , поэтому код будет как есть. Тем не менее время с 8266 забирает нормально. Рассматривайте это как пример к действию. Все манипуляции производим во вкладке robotdyn. Сначала объявляем переменную data1 . В ней будет находится время с 8266. Добавить на первой вкладке

Код: Выделить всё

#include <TimeLib.h>
#include <DS1307RTC.h>

char const SELF_NAME[] = "AMS Mega";
char const VERSION[]   = "0.16";

  String data1;  // Время с ESP8266  
Дальше заменить саму вкладку robotdyn

Код: Выделить всё

/*
  Modul RobotDyn
  part of Arduino Mega Server project
*/

#ifdef ROBOTDYN_FEATURE

bool sFlag = true;

bool sFlag1 = true;

// Serial request
#define MAX_SERIAL_REQ  32 

#define MAX_SERIAL1_REQ  32
String serialReq = "";

String serial1Req = "";

String dataString = "";

void robotdynInit() {
  Serial3.begin(115200);

  Serial2.begin(9600);// Можем подключить второй сериал порт и читать данные с любой ардуины
  modulRobotdyn = MODUL_ENABLE;
  started("RobotDyn", true);
}

void printSerialStr() {

  Serial.print("[");
  Serial.print(serialReq);
  Serial.println("]");

}
void printSerial1Str() { // второй сериал порт

  Serial.print("/");
  Serial.print(serial1Req);
  Serial.println("/");

}

void parseSerialCmd() {
  String command, parameter;
  
  if (serialReq.indexOf(F("?")) >= 0) {


    int pBegin = serialReq.indexOf(F("?")) + 1;


    if (serialReq.indexOf(F("=")) >= 0) {
       int pParam = serialReq.indexOf(F("="));
       command   = serialReq.substring(pBegin, pParam);              
       parameter = serialReq.substring(pParam + 1);              
    } else {
        command = serialReq.substring(pBegin);              
        parameter = "";
      }


  } // if (request.indexOf(F("?")) >= 0)
} // parseSerialCmd()

void parseSerial1Cmd() {
  String command1, parameter1;
  
  if (serial1Req.indexOf(F("?")) >= 0) {

    int pBegin1 = serial1Req.indexOf(F("?")) + 1;

    if (serial1Req.indexOf(F("=")) >= 0) {
       int pParam1 = serial1Req.indexOf(F("="));
       command1   = serial1Req.substring(pBegin1, pParam1);              
       parameter1 = serial1Req.substring(pParam1 + 1);              
    } else {
        command1 = serial1Req.substring(pBegin1);              
        parameter1 = "";
      }
 
  } // if (request.indexOf(F("?")) >= 0)
} // parseSerialCmd()


void parseSerialStr() {
  if (serialReq[0] == '?') {

    parseSerialCmd();
  } else {
      printSerialStr();
    }
}

void parseSerial1Str() {

    if (serial1Req[0] == '?') {
    parseSerial1Cmd();
  } else {
      printSerial1Str();
    }
}

 // checkSerial()

void checkSerial() {

    while (Serial3.available() >= 5) {
    if (sFlag) {
      serialReq = "";
      sFlag = false;
    }
    char c = Serial3.read();
    if (c == 10) {
      sFlag = true;
      parseSerialStr();
    }
    else if (c == 13) {
      // skip
    }
    else {
      if (serialReq.length() < MAX_SERIAL_REQ) {
        serialReq += c;
      }

    if (serialReq.startsWith("2020-")) {        // Когда прилетает строка с 8266 , которая начинается с 2020
     data1 = (serialReq.substring(11,16));   // вырезаем цифры с 11 по 16 
 
    Serial.println(data1);                         //выводим в сериал. Потом куда угодно

  }


    } // if
  } // while (Serial3.available() > 0)
  
} // checkSerial()

void checkSerial1() {
  while (Serial2.available() > 0) {

    if (sFlag1) {
      serial1Req = "";
      sFlag1 = false;
    }
    char c = Serial2.read();
    if (c == 10) {
      sFlag1 = true;
      parseSerial1Str();
    }
    else if (c == 13) {
      // skip
    }
    else {
      if (serial1Req.length() < MAX_SERIAL1_REQ) {
        serial1Req += c;
      }

      if (serial1Req.startsWith("T=")) {       

       // if (serialReq.startsWith("21")) { 
     data3 = (serial1Req.substring(3,8));
     data2 = (serial1Req.substring(11,16));
     
     data4 = (serial1Req.substring(17));

     Serial.println(data3);
     Serial.println(data2);
     Serial.println(data4);
  }

    } // if
  } // while (Serial3.available() > 0)
}
void robotdynWork() {
  checkSerial();
  checkSerial1();


#ifdef TFT

        tft.setTextColor(White, Blue);
        tft.setTextSize(6);
        tft.setCursor(100, 92);           // выводим время - час


        tft.print(data1);

        tft.setTextColor(White, Orange);
        tft.setTextSize(2);
        tft.setCursor(10, 10);              
        tft.print("volt");

        tft.setTextColor(White, Blue);
        tft.setTextSize(3);
        tft.setCursor(74, 10);          
        tft.print(data2);


        tft.setTextColor(White, Orange);
        tft.setTextSize(2);
        tft.setCursor(200, 10);         
        tft.print("boiler");

        tft.setTextColor(White, Blue);
        tft.setTextSize(3);
        tft.setCursor(290, 10);         
        tft.print(data3);

        tft.setTextColor(White, Orange);
        tft.setTextSize(2);
        tft.setCursor(10, 40);          
        tft.print("cont");

        tft.setTextColor(White, Blue);
        tft.setTextSize(3);
        tft.setCursor(90, 40);         
        tft.print(data4);
     
#endif
}


#endif // ROBOTDYN_FEATURE
В результате в сериале Меги увидим
  • 2
    22
    22:
    22:1
    22:17
    22:17
    22:17
    22:17
PS/ Я сверху Меги посадил TFT экран , поэтому интернет шилд прицепить не получается.
Если что то не понятно , спрашивайте. По мере возможности отвечу.
СпойлерПоказать
IMG_20201015_222518.jpg
IMG_20201015_222518.jpg (1.62 МБ) 627 просмотров
После замены вкладки желательно подчистить папку Темп . Иначе может подцепиться старая.
За это сообщение автора serghei поблагодарил:
pvvup (Пт окт 16, 2020 9:49 am)
Рейтинг: 1.22%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
pvvup
Сообщения: 4
Зарегистрирован: Чт окт 15, 2020 8:57 am
Благодарил (а): 5 раз
Поблагодарили: 0

Re: RTC + AMS

Сообщение pvvup » Вс окт 18, 2020 9:19 am

Приветствую,
serghei ещё раз спасибо, но это не совсем то, что я спрашивал. Я так понял, ты под свой TFT вытянул нужные данные и крутишь время с NTP на экране. Я же спрашивал какой командой синхронизировать время ESP-NTP c RTC.
Дело в том, что (serialReq) у меня уже выдает время с ESP-NTP в сериал, причем одной строкой. А вот как сказать RTCке, что сегодня 2020-10-18, а не 2000-01-17, ну и время соответственно.
И ещё один момент: ты ловишь время после "2020-", а 1 января 2021 будешь скетч переписывать? Надо, наверное выловить предыдущий символ, и по нему вытягивать всё остальное.
Попробовал "processing-3.5.4" - в другой ветке пишут, что с его помощью можно время подкорректировать, но У ВЫ опять косяки какие то, утомляют разборки с несоответствием библиотек, команд и прочего. Я то надеялся, что Ардуино это когда взял железяку, установил ПО, залил скетч и в космос, а тут получается как у Жванецкого - "чуть ли не историю сначала надо перечитывать".
Ну что ж, век живи, век учись. Надо было с детства этим заниматься.
Жду Ethernet шилд, нашел на просторах РУнета магазинчик с бросовой ценой на некоторые элементы, чем с китайцев ждать, так ещё и у наших дешевле!
serghei
Сообщения: 2561
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 297 раз
Поблагодарили: 281 раз

Re: RTC + AMS

Сообщение serghei » Вс окт 18, 2020 7:02 pm

pvvup писал(а):
Вс окт 18, 2020 9:19 am
Я же спрашивал какой командой синхронизировать время ESP-NTP c RTC.
Я же вот Тут рассказал как синхронизировать время автоматически ( картинка ). И процессинг нужен 1.5.1 Я понимаю , что всё это безбожно устарело , но тем не менее работает. На данный момент этих часов у меня нет , но можно найти мой пост , где я впервые получил синхронизацию времени.
Еще момент - у меня не работало пока не прописал в скетче dns .
pvvup писал(а):
Вс окт 18, 2020 9:19 am
И ещё один момент: ты ловишь время после "2020-", а 1 января 2021 будешь скетч переписывать? Надо, наверное выловить предыдущий символ, и по нему вытягивать всё остальное.
Придется переписывать. И даже ещё раньше - я перехожу на зимнее время. Как это автоматизировать я не представляю. Можно конечно ловить первые 3 цифры.
PS/ Для меня АМС это развлечение. В том виде какой он сейчас - для серьёзной работы не годится. Начать с реконнекта в wifi сети.
Если Вы умеете проще передавать строки по сериалу - опубликуйте тут. Лучше в соответствующей ветке.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
pvvup
Сообщения: 4
Зарегистрирован: Чт окт 15, 2020 8:57 am
Благодарил (а): 5 раз
Поблагодарили: 0

Re: RTC + AMS

Сообщение pvvup » Вс окт 18, 2020 9:13 pm

Прошу прощения за "тыканье" - дурная привычка.
Думаю ветка не важна, вопрос касается rtc, но если не прав перенаправьте.
Я понимаю, что процесс синхронизации заточен не то на функцию, не то на переменную time_t, но попытка уравнять строку с есп и эту функцию приводит или к ошибке или к "0".
Да и, я так понял, реально рабочего варианта дистрибутива АМС для рободина нет.
Ещё, обращаюсь ко всем: в скетчах надо бы приписывать версии библиотек как по функциям, так и по платам.
Возможно что при определённом наборе IDE - плата - библиотеки, оно и заводится с пол тыка, а подбор всего этого вручную угнетает.
serghei
Сообщения: 2561
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 297 раз
Поблагодарили: 281 раз

Re: RTC + AMS

Сообщение serghei » Вс окт 18, 2020 10:38 pm

Единственная проблема с синхронизацией по сети у меня была с платой Дуи пока я не добавил dns в скетч. Сейчас с телефона показать не смогу. Что касается плат и ide. Всё это было написано пять лет назад. 017 версии компилятся в 1.8.5 . Дополнительные библиотеки идут в дистрибутиве. Единственное - надо заменить Time.h на TimeLib.h Залить сюда смогу завтра вечером.
Что касается есп8266 , то последние дрова были 2.4.1 r2. Хотя когда вставил этот веб в гейт майсенсора , то дрова были 2.6.5
Пример можно посмотреть тут. https://mysensors.ru/forum/viewtopic.php?f=5&t=485
За это сообщение автора serghei поблагодарил:
pvvup (Пн окт 19, 2020 4:23 pm)
Рейтинг: 1.22%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
eGorka
Сообщения: 182
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 1 раз
Поблагодарили: 25 раз

Re: RTC + AMS

Сообщение eGorka » Пн окт 19, 2020 6:29 pm

pvvup писал(а):
Вс окт 18, 2020 9:19 am
... Я же спрашивал какой командой синхронизировать время ESP-NTP c RTC. ...
esp32 + DS3231 функция синхронизации времени NTP сервера с RTC часами.

Код: Выделить всё

/*
#include "NTPClient.h"
#include "WiFiUdp.h"
WiFiUDP udp;
NTPClient ntp(udp);
unsigned int ntpPort = 1337;
String poolServer = "pool.ntp.org";
int timeOffset = 3;
int time_correct = 1;  // + 1 sec.
*/

uint8_t UintToBcd(uint8_t val){
  return val + 6 * (val / 10);
}

void ntp_Synch(){
  uint8_t _dt[7] = {0,0,0,0,0,0,0};
  uint8_t _monthL(0);
  uint8_t _mDays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  unsigned long epochTime;
  
  ntp.begin(ntpPort);
  ntp.setPoolServerName(poolServer.c_str());
  ntp.setTimeOffset(timeOffset * 3600);
  while(!ntp.update()) {
    ntp.forceUpdate();
  }
  epochTime = ntp.getEpochTime()-946684800UL + time_correct;
  ntp.end();
  
  _dt[0] = epochTime % 60;
  epochTime /= 60;
  _dt[1] = epochTime % 60;
  epochTime /= 60;
  _dt[2] = epochTime % 24;
  epochTime /= 24;
  _dt[3] = (epochTime + 6) % 7;
  int days=0;
  while(days + ((_dt[6] % 4) ? 365 : 366) <= epochTime) {
     days += (_dt[6] % 4) ? 365 : 366;
     _dt[6]++;
  }
  epochTime -= days;
  for (_dt[5]; _dt[5]<12; _dt[5]++) {
    if (_dt[5] == 1) {
      if (_dt[6] % 4) _monthL = 28;
      else _monthL = 29;
    }
    else _monthL = _mDays[_dt[5]];
    if (epochTime >= _monthL) epochTime -= _monthL;
    else break;  
  }
  _dt[5]++;
  _dt[4] = epochTime + 1;

  Wire.beginTransmission(0x68);
  Wire.write(0x00);
  for(int i = 0; i < 7; i++){
    Wire.write(UintToBcd(_dt[i]));
  }
  Wire.endTransmission();
}
За это сообщение автора eGorka поблагодарил:
pvvup (Пн окт 19, 2020 7:30 pm)
Рейтинг: 1.22%
pvvup
Сообщения: 4
Зарегистрирован: Чт окт 15, 2020 8:57 am
Благодарил (а): 5 раз
Поблагодарили: 0

Re: RTC + AMS

Сообщение pvvup » Пн окт 19, 2020 7:35 pm

Ох уж мне эти специалисты! Это куда? Взять ЕСП32, Залить в него этот скетч, куда то подключить РТСку и синхронизировать? А потом подключить к Рободину? Ведь для Меги WiFiUDP.h ни о чем. А в ЕСПхе уже НТП работает, но РТСка то к Меге подключена :lol:
Моя идея такова: довести АМС для Рободина до ума с привязкой к более менее совресенным требованиям (IDE и библиотеки). Но уж коль у нас в наличии WiFi на борту - пока есть Интернет, 1.АМС берет время с RTC (при наличии) и раз в час или в сутки сверяет его с прилетевшим NTP c ESP и при необходимости корректирует. 2. Нет RTC Тупо забираем время с NTP c ESP и с ним работаем.
Далее всё таки хочется довести тему до конца и вэб интерфейс получать по воздуху (думаю для этого Рободин и создан).
Но мне ещё учиться и учиться. :geek:
eGorka
Сообщения: 182
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 1 раз
Поблагодарили: 25 раз

Re: RTC + AMS

Сообщение eGorka » Пн окт 19, 2020 8:29 pm

pvvup писал(а):
Пн окт 19, 2020 7:35 pm
Ох уж мне эти специалисты!
Это кого Вы тут "специалистами" обзываете?
Вам дали готовую функцию(не скетч), первую часть(до Wire.beginTransmission(0x68);) в код esp8266, переменную _dt через serial из esp8266 перегоняем в Мегу, в Меге запускаем оставшийся код(с Wire.beginTransmission(0x68);).

PS
Для Ваших идей надо достаточно хорошо разбираться в коде.
АМС в Меге + ЕСП как WiFi свисток - так себе идея.
АМС в ЕСП + Мега(с кучей аналоговых и цифровых входов и 5-ти вольтовой логикой) мне кажется более правильной.
Хотел помочь, получилось как обычно, больше не буду, обещаю.
За это сообщение автора eGorka поблагодарил:
pvvup (Вт окт 20, 2020 11:15 am)
Рейтинг: 1.22%
Ответить