Часы и связь с сервером. Возможно?

Gregory1
Offline
Зарегистрирован: 16.11.2020

Здравствуйте. Никогда не занимался Arduino, но вот сейчас хочу собрать одно устройство, и появился вопрос, можно ли его реализовать на Arduino?

Кратко, задача устойства - считать время, отображать его (в формате ЧЧ:ММ), и периодически отправлять текущее значение на сервер.

Детальнее:

1. Три счетчика времени с индикацией ЧЧ:ММ.

1.1 Первый - обычные часы.

1.2 Второй - (суточный) - ведет отсчет времени, когда на на входе устройства присутствует логическая "1". При появлении на входе "0" - останавливается, при "1" - продолжает считать дальше. Обнуляется в 00:00 (для этого и нужны первые часы).

1.3 Третий - (сессионный) - ведет отсчет времени, когда на на входе устройства присутствует логическая "1". При появлении на входе "0" - останавливается, при "1" - обнуляется и считает снова.

2. С определенным интервалом происходит передача значения второго (суточного) счетчика на сервер в интернете (например, по HTTP методом POST или GET).

Возможно ли такое реализовать, если да - насколько высока сложность такого проекта, какие аппаратные модули можно для этого использовать, и в каком направлении искать информацию?

 

mixail844
Offline
Зарегистрирован: 30.04.2012
если программировали до этого когда либо , понятие "клиент-сервер приложение" не вызывает у вас вопросов. то должно быть не сложно.
вы не продумали как изначально будете настраивать обычные часы.
 
почитать про модули "часы реального времени для ардуино" 
модуль W5500 / W5100 для ардуино

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а зачем время  считать? Сервер и запишет время системное, сервера, не???

вот приблизительно так:
Число записей в таблице - 107598
Данные по температуре за последние 120 минут!

01 2020-11-16 09:11:48 19.940 19.880 19.810 5C:CF:7F:C0:E0:D5 19.86
02 2020-11-16 09:13:09 19.560 19.500 19.440 5C:CF:7F:C0:E0:D5 19.485
03 2020-11-16 09:14:27 19.940 19.880 19.810 5C:CF:7F:C0:E0:D5 19.86

...

87 2020-11-16 11:06:54 19.880 19.810 19.750 5C:CF:7F:C0:E0:D5 19.7975
88 2020-11-16 11:08:15 20.130 20.000 20.000 5C:CF:7F:C0:E0:D5 20.0325
89 2020-11-16 11:09:35 20.440 20.380 20.310 5C:CF:7F:C0:E0:D5 20.36
90 2020-11-16 11:10:53 19.880 19.750 19.690 5C:CF:7F:C0:E0:D5 19.7525

 

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

а зачем время  считать? Сервер и запишет время системное, сервера, не???

вот +1000

Серверу считать правильное время в 100 раз проще, чем ардуине... опять же можно получать сигналы точного времени по сети. И блок RTC на ардуине не понадобится.

А ардуина пусть просто считывает свой сигнал 0 или 1 и сбрасывает это на сервер

Gregory1
Offline
Зарегистрирован: 16.11.2020

mixail844 пишет:

если программировали до этого когда либо

Да, в основном на PHP.

mixail844 пишет:

вы не продумали как изначально будете настраивать обычные часы

Предполагал, что с помощью клавиатуры, но можно брать текущее время с сервера. Не знаю какой вариант проще реализуем, вероятно второй.

mixail844 пишет:

почитать про модули "часы реального времени для ардуино" 
модуль W5500 / W5100 для ардуино
Спасибо.

ua6em пишет:

а зачем время  считать?

Задача не только отправлять на сервер, но и отображать.

b707
Offline
Зарегистрирован: 26.05.2017

Gregory1 пишет:

Задача не только отправлять на сервер, но и отображать.

отоброжать тоже можно время, полученное с сервера

Gregory1
Offline
Зарегистрирован: 16.11.2020

b707 пишет:

отоброжать тоже можно время, полученное с сервера

Можно, но для этого надо как минимум каждую минуту связываться с сервером. Будет ли это оптимальным решением, не знаю.

Впрочем, без первых часов наверно можно обойтись, периодически запрашивая дату/время на сервере, чтобы обнулить счетчики при наступлении новых суток (не обязательно обнулять строго в 00:00, можно и позже, главное до утра).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

для простоты реализации я взял WEMOS, пишу в базу на сервере, делается на коленке буквально за час,
для часиков можно взять DS3231, как калибровать смотрим тут и будет Вам счастье

 

b707
Offline
Зарегистрирован: 26.05.2017

Gregory1 пишет:

b707 пишет:

отоброжать тоже можно время, полученное с сервера

Можно, но для этого надо как минимум каждую минуту связываться с сервером.

не нужно. Стандартная ардуина содержит внутри таймер, точности которого вполне хватит, чтобы отсчитывать и показывать время самостоятельно,  обновляя его с сервера пару раз в сутки. не больше

Gregory1
Offline
Зарегистрирован: 16.11.2020

ua6em пишет:

для простоты реализации я взял WEMOS, пишу в базу на сервере, делается на коленке буквально за час,
для часиков можно взять DS3231, как калибровать смотрим тут и будет Вам счастье

Вот бы с этим всем ещё разобраться... Но я рад, что задача в принципе реализуема, буду изучать пока.

b707 пишет:

не нужно. Стандартная ардуина содержит внутри таймер, точности которого вполне хватит, чтобы отсчитывать и показывать время самостоятельно,  обновляя его с сервера пару раз в сутки. не больше

Тогда вполне подходящий вариант.

Большое спасибо всем за ответы!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Если доступен вайфай в точке мониторинга, то это самое простое решение

Gregory1
Offline
Зарегистрирован: 16.11.2020

ua6em пишет:

Если доступен вайфай в точке мониторинга, то это самое простое решение

Доступен. Спасибо!

Для индикации к нему можно подключить дисплей?

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Если доступен вайфай в точке мониторинга, то это самое простое решение

Вемос-мини не лучше? - не люблю формат уно

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Gregory1 пишет:

ua6em пишет:

Если доступен вайфай в точке мониторинга, то это самое простое решение

Доступен. Спасибо!

Для индикации к нему можно подключить дисплей?

можно

Gregory1
Offline
Зарегистрирован: 16.11.2020

ua6em пишет:

можно

Ок, спасибо.

Gregory1
Offline
Зарегистрирован: 16.11.2020
При попытке загрузить скетч из Arduino IDE на плату, возникает ошибка:
 
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x30
... (тут еще 9 попыток)
An error occurred while uploading the sketch
 
Плата: ESP-12E WeMos D1 UNO R3 CH340 CH340G WiFi (https://aliexpress.ru/item/1005001436547177.html).
Установлен драйвер CH341SER.INF
В списке выбираю Arduino Uno WiFi (может, не то?)
Подскажите, в чем может быть причина?

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

сконфигурировать перемычками только ESP, да после можно попробовать выбрать WEMOS D1 R1, такой платы не было, так что точно не знаю, но тема такая уже была на форуме - поищите

Gregory1
Offline
Зарегистрирован: 16.11.2020

Установил пакет, выбрал плату - всё заработало. Спасибо большое!

Gregory1
Offline
Зарегистрирован: 16.11.2020

Не работает дисплей 2004 с I2C, подключенный к плате (ESP-12E WeMos D1 UNO R3 CH340 CH340G WiFi).

Подключал так:

SDA - D14/SDA
SCL - D15/SCL
VCC - +5V
GND - GND

Кроме библиотеки Liquidcrystal i2c, пробовал еще New-LiquidCrystal - не работает.

I2C cканер ничего не находит.

И ещё - дисплей мерцает. Похоже, мерцает не подсветка, а символы (две строки инициализации), и дело не в плохом контакте проводов подключения. При питании от USB мерцание проявляется значительно больше (но тоже бывает по-разному), от источника 5В - меньше.

Подскажите, пожалуйста, в чём может быть дело.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Gregory1

Подтяжка i2c есть на дисплее?

Gregory1
Offline
Зарегистрирован: 16.11.2020

Rumata пишет:

Gregory1

Подтяжка i2c есть на дисплее?

А как определить?

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Посмотреть на плату дисплея в поисках нужных резисторов. Можно мультиметром промерить еще

Gregory1
Offline
Зарегистрирован: 16.11.2020

Если я правильно понял, и речь о двух резисторах (4.7к) на плате расширения, подтягивающие SDA и SCL к плюсу питания - то да, они присутствуют.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Gregory1 пишет:
Если я правильно понял.

Да, правильно. А на ESP точно на те ноги СЦЛ и СДА? Мало ли, бывает путаница Dxx/GPIOxx, особенно после перехода с ардуины. Больше то особо нечему глючить, сканер по любому должен находить адрес

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Rumata пишет:

Gregory1 пишет:
Если я правильно понял.

Да, правильно. А на ESP точно на те ноги СЦЛ и СДА? Мало ли, бывает путаница Dxx/GPIOxx, особенно после перехода с ардуины. Больше то особо нечему глючить, сканер по любому должен находить адрес

Еще вот мысль пришла, но тоже из области маловероятных. 4к7 это для 5-вольтовой логики. Для ESP надо около 2к2 (надо уточнить по ДШ)

Morroc
Offline
Зарегистрирован: 24.10.2016

Нет, это пофиг по большому счету. Мне попадались дисплеи, где расширитель порта разведен на разные ноги (т.е. вот тут: <микруха i2c -> контроллер дисплея> по разному), я бы для начала тупо разные библиотеки попробовал, потом проверил по возможности куда там что с расширителя идет на дисплее.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Библиотеки на i2c сканер влиять не должны. 

Gregory1
Offline
Зарегистрирован: 16.11.2020

Большое спасибо всем за ответы.

После того, как отключил всё от остальных входов/выходов (тактовые кнопки, переключатель, светодиоды) - дисплей начал находиться сканером, и заработал (скетч "Hello, World!") с обычной библиотекой LiquidCrystal I2C, хотя она и выводит предупреждение (WARNING: library LiquidCrystal_I2C claims to run on avr architecture(s) and may be incompatible with your current board which runs on esp8266 architecture(s).).

Мерцание никуда не делось. Кстати, присмотрелся - мерцает подсветка, а не символы. Подключал второй дисплей (уже 1602, тоже со своей платой I2C) - тоже мерцает, хоть и меньше. Больше всего мерцает при питании от USB (ноутбук). Пробовал два трансформаторных БП 5В 300 мА, и 600 мА (мощнее нет под рукой) - мерцает меньше (от 600 мА почти нормально), возможно дело в питании.

Дальше самое интересное. Подключил всё как было к входам/выходам, вставил в свой скетч код для работы с дисплеем (тот, что из примера "Hello, World!") - и дисплей не работает, и мой прежний код работает глючно (самопроизвольно запускается цикл, кнопки не реагируют на нажатие). Выяснил, что мой прежний код работает нормально до тех пор, пока не раскомментирую строчку lcd.init(); Но при подключении другого дисплея (1602) - код моего скетча так же работает глючно, но дисплей работает. Уже не знаю где искать...

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

ESP8266WiFiMulti WiFiMulti;

LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 20 chars and 4 line display

const char wifiID[] = "*****";         // Wi-Fi имя
const char wifiPass[] = "*****";     // Wi-Fi пароль
const String servBaseURL = "*****";   // Адрес рабочей директории на сервере

const int pinSS = D2;                     // Кнопка "Старт/стоп"
const int pinSynchro = D11;               // Кнопка "Синхронизация"
const int pinPresence = D3;               // Датчик присутствия
const int LEDCount = D4;                  // Светодиод "Отсчёт времени" (белый)
const int LEDBreak = D6;                  // Светодиод "Перерыв" (желтый)
const int LEDFinish = D10;                // Светодиод "Окончание" (красный)
const int LEDComplete = D8;               // Светодиод "Выполнено" (зеленый)
const unsigned int debounceDelay = 100;   // Задержка для устранения дребезга контактов, мс
const unsigned int timeStep = 1000;       // Временной шаг цикла, мс

boolean curpinSS = LOW;                   // Текущее состояние кнопки "Старт/Стоп"
boolean prevpinSS = LOW;                  // Предыдущее состояние кнопки "Старт/Стоп"
boolean curpinSynchro = LOW;              // Текущее состояние кнопки "Синхронизация"
boolean prevpinSynchro = LOW;             // Предыдущее состояние кнопки "Синхронизация"
boolean curpinPresence = LOW;             // Текущее состояние датчика присутствия
boolean prevpinPresence = LOW;            // Предыдущее состояние датчика присутствия
boolean countOn = false;                  // Состояние отсчета времени
boolean sessionComplete = false;          // Состояние завершенности сессии
unsigned long buttonLastChangeTime = 0;   // Время последнего изменения состояния контактов кнопки, мс (используется для всех кнопок и переключателей)
unsigned long dailyCounter = 0;           // Суточный счетчик, мс
unsigned long sessionCounter = 0;         // Сессионный счетчик, мс
unsigned long breakCounter = 0;           // Счетчик перерыва, мс
unsigned long prevTime = 0;               // Предыдущее время цикла, мс
unsigned long curTime = 0;                // Текущее время цикла, мс
unsigned int synchroTime = 0;
unsigned int synchroRecTime = 0;
unsigned int synchroFactTime = 0;

// Декларируем функции
void startBreak();
void servUpdate(int tTime);
unsigned int ms2mins(unsigned long ms);
String synchro();

void setup() {
  
  Serial.begin(9600);

  while (!Serial)
  {}
  
  pinMode(pinSS, INPUT);
  pinMode(pinSynchro, INPUT);
  pinMode(pinPresence, INPUT);
  pinMode(LEDCount, OUTPUT);
  pinMode(LEDBreak, OUTPUT);
  pinMode(LEDFinish, OUTPUT);
  pinMode(LEDComplete, OUTPUT);

  delay(5000);
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(wifiID, wifiPass);

  Serial.println("synchro.php response: " + synchro());

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Hello, World!");
}

void loop() {

  // Обработка нажатий кнопки "Старт/стоп"
  curpinSS = digitalRead(pinSS);
  if (curpinSS != prevpinSS && millis() - buttonLastChangeTime > debounceDelay && digitalRead(pinPresence) != HIGH) {
    if (curpinSS == HIGH && prevpinSS == LOW) {
      countOn = !countOn;
      if (!countOn) {
        startBreak();
      }
    }
    prevpinSS = curpinSS;
    buttonLastChangeTime = millis();
  }

  // Обработка нажатий кнопки "Синхронизация"
  curpinSynchro = digitalRead(pinSynchro);
  if (curpinSynchro != prevpinSynchro && millis() - buttonLastChangeTime > debounceDelay) {
    if (curpinSynchro == HIGH && prevpinSynchro == LOW) {
      if (!countOn) {
        synchro();
      }
    }
    prevpinSS = curpinSS;
    buttonLastChangeTime = millis();
  } 

Далее идет продолжение моего скетча, весь не привожу из-за громоздкости.

Gregory1
Offline
Зарегистрирован: 16.11.2020

При физически отключенном дисплее мой код так же работает глючно, видимо, есть программная проблема (может, несовместимость библиотеки LiquidCrystal I2C с моим кодом, на данной архитектуре?..)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Gregory1, хотелось бы увидеть полную схему, т.к. очень похоже на путаницу с пинами.

Gregory1
Offline
Зарегистрирован: 16.11.2020
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это он?

Почему у Вас I2c подключены к d14-d15?

Gregory1
Offline
Зарегистрирован: 16.11.2020

Вот так это выглядит:

http://a.radikal.ru/a41/2103/a1/dcb63a7478cb.jpg

http://d.radikal.ru/d42/2103/85/7c2326f66557.jpg

Ни с того ни с сего (я только менял USB-порт) начал выводить в Serial monitor какую-то отладочную информацию.

Снова загрузил обычный I2C сканер (подключены все мои светодиоды и кнопки), он вначале искал, но не находил. После повторного запуска ищет через раз, выводит такое:

scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 6
cnt 

connected with Columbus, channel 11
dhcp client start...
ip:192.168.1.104,mask:255.255.255.0,gw:192.168.1.1
pm open,type:2 0

Чем дальше ковыряю, тем менее понятно.

Кстати, он должен соединяться с Wi-Fi, если загружен и работает просто обычный I2C сканер?

Gregory1
Offline
Зарегистрирован: 16.11.2020

andriano пишет:

Это он?

У меня полноразмерный WeMos D1 (не мини). (не знаю, есть ли разница в выводах)

andriano пишет:

 

Почему у Вас I2c подключены к d14-d15?

На нах написано SDA, SCL. Видел в ролике, человек так же подключает: https://www.youtube.com/watch?v=3MzcV60kmJQ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Это он?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Gregory1 пишет:

У меня полноразмерный WeMos D1 (не мини). (не знаю, есть ли разница в выводах)

Т.е. не знаете, но все равно подключаете?

Цитата:

На нах написано SDA, SCL. Видел в ролике, человек так же подключает: https://www.youtube.com/watch?v=3MzcV60kmJQ

Ну так и спрашивали бы у человека из ролика.

Я сильно подозреваю, что SDA/SCL - это совсем не D14/d15, а какие-нибудь D1/D2, и на плате одни и те же контакты микросхемы выведены на разные контакты платы. Вы подключаете к этим контактам разные устройства, думая, что контакты тоже разные, а на самом деле они одни и те же, и устройства оказываются включенными в параллель и начинают конфликтовать между собой.

Прозвоните тестером Ваши SDA/SCL со всеми остальными разъемами на плате.

Gregory1
Offline
Зарегистрирован: 16.11.2020

andriano пишет:

одни и те же контакты микросхемы выведены на разные контакты платы.

Контакты звонятся, Вы правы. Огромное спасибо!

Переподключу и буду пробовать дальше.

Gregory1
Offline
Зарегистрирован: 16.11.2020

Всё заработало.

Ещё раз спасибо всем, кто откликнулся.