• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Простые WiFi часы

Сергей_Ф

Moderator
Команда форума
@voldemar2005 :)
Наткнулся на ещё один момент с платой Witty - может кому пригодится. Кнопка Flash (pin 0) на этой плате притягивается к + только на время перезагрузки модуля. во время работы на ней неопределенный потенциал. Я целый вечер вчера убил и сегодняшнее утро, пока не догадался померить тестером. Естественно, в этих часах она работала непредсказуемо. Пришлось на pin 4 перекинуть, благо эта кнопка на плате притянута к +, а от RTC я отказался. В крайнем случае RTC можно на pin 0 перекинуть.
Зто касается только платы Witty!!! В остальных случаях всё равно куда резистор паять :).
в clock5web.ino
Код:
//#define INVERT_MATRIX_ORDER  // раскомментировать для другого порядка расположения матриц
в max7219.ino
Код:
#ifdef INVERT_MATRIX_ORDER
  for ( int addr = 1, addr1 = MAX_USE - 1; addr < MAX_USE; addr++, addr1--)
  {
    buf_command[addr1 * 2] = row + 1;
    buf_command[addr1 * 2 + 1] = value24[addr - 1];
  }
#else
  for ( int addr = 1; addr < MAX_USE; addr++)
  {
    buf_command[addr * 2] = row + 1;
    buf_command[addr * 2 + 1] = value24[addr - 1];
  }
#endif

P.S. В дефолтных настройках прописано летнее время. Ну для нас это теперь совсем не актуально, но и в других странах не возникнут ли проблемы при запуске часов в зимнее время у людей? Может стоит поставить false?
При использовании в пароле сети WiFi знака "&" - соединение не устанавливается. Позже найду у себя код, где это возможно и список доступных сетей приделаю.
 
Последнее редактирование:
Может стоит поставить false?
да, это логично, поменял ...

и список доступных сетей приделаю
в принципе у меня этот код есть (web.ino в районе 350 строки), но он закомментирован, почему то не все точки доступа находятся.
 
Обновил первый пост. Добавил возможность обновления через WEB.
для обновления необходимо:
  • раскомментировать в Clock5web.ino строку [HASHTAG]#include[/HASHTAG] <ESP8266HTTPUpdateServer.h>
  • скомпилировать скетч
  • подключитья к WiFi
  • в настройках выбираем "Обновление прошивки"
  • выбираем файл, который находиться в папке пользователя: C:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ\AppData\Local\Temp\buildxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.tmp\Clock5web.ino.bin и обновляемся.
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@voldemar2005
Добрый день, как обещал даю код для того, что бы ввод из формы web не корёжил символы отличные от алфавита и цифр. Без этого пароль и имя сети ввести с некоторыми символами нельзя, хотя они легальны для использования. Как сделать более изящно, не вводя String, я не знаю. Только тупая замена.
в теле web.ino надо изменить процедуру handleSetWiFi так:
Код:
void handleSetWiFi()
{
  serv_ms = millis();
  //url='/set_wifi?as='+as+'&ap='+ap+'&ss='+ss+'&sp='+sp;
  cleanASCIIstrcpy( eeprom_data.ap_ssid, HTTP.arg( 0).c_str());
  cleanASCIIstrcpy( eeprom_data.ap_pass, HTTP.arg( 1).c_str());
  cleanASCIIstrcpy( eeprom_data.sta_ssid, HTTP.arg( 2).c_str());
  cleanASCIIstrcpy( eeprom_data.sta_pass, HTTP.arg( 3).c_str());
  strcpy( eeprom_data.test, "ok");
  write_settings_ESP();
}
добавив перед ней
Код:
void cleanASCIIstrcpy(char * out, const char * input) {
  int i =0;
  int j = 0;
  while ( input[i] != '\0' ) {
    if ( input[i] != '%' && input[i] != '+') {
      out[j++] = input[i++];
    }
    else { 
      if ( input[i] != '+') {
        out[j++] = ' '; i++;
        }
      else if ( input[i] != '%' ) {
        if ( input[i+1] == '2' ) {
          if ( input [i+2] >= '1' &&  input [i+2] <= '9' ) {
            out[j++] = '!' + input [i+2] - '1'; i +=3;
          }
            else if ( input [i+2] >= 'A' &&  input [i+2] <= 'F' ) {
                    out[j++] = '!' + input [i+2] - 'A'; i +=3;
          }
          else { // ignore symbol
            i +=3;
            }

        } 
        else {
          if ( input[i+1] == '3' && input [i+2] >= 'A' &&  input [i+2] <= 'F' ) {
              out[j++] = ':' + input [i+2] - 'A'; i +=3;
          }
          else if ( input[i+1] == '4' && input [i+2] >= '0' ) {
             out[j++] = '@'; i +=3;
          } 
          else if ( input[i+1] == '5' && input [i+2] >= 'B' &&  input [i+2] <= 'F' ) {
            out[j++] = '[' + input [i+2] - 'B'; i +=3;
          }
          else if ( input[i+1] == '6' && input [i+2] >= '0' ) {
             out[j++] = '`'; i +=3;
          } 
          else if ( input[i+1] == '7' && input [i+2] >= 'B' &&  input [i+2] <= 'F' ) {
            out[j++] = '{' + input [i+2] - 'B'; i +=3;
          }
          else { // ignore symbol
            i +=3;
          }

        }
      }
    }
  }
 out[j] = '\0';
}
 

Сергей_Ф

Moderator
Команда форума
@nikolz Ваше мнение очень ценно для всех нас, но к теме отношения не имеет, имхо. Какую цель Вы преследуете этим сообщением? Оскорбить или обидеть ТС? Можете считать, что это у Вас получилось.
Похоже Вы забыли, что тоже когда-то с чего-то начинали. Я, например, не вижу в этих часах ничего плохого. Тем более, синхронизации времени по Интернет у часов по ссылкам нет и сделать это в них не удастся.
 

Сергей_Ф

Moderator
Команда форума
@nikolz "Альтернативные" решения есть в любом магазине промтоваров, но речь в данном топике не про них. ТС сделал часы и поделился своим решением. Сделал не плохо, надо сказать. Слишком для Вас просто? Так он и сам этого не скрывал - тема называется "Простые часы с WiFi". Кому неинтересно, спокойно проходят мимо.
Как минимум два человека повторили, что в этом плохого? А с Вашими комментариями, никакого стимула развиваться дальше нет, Вы уж извините. Хочется замкнуться в себе и перестать что-то писать на форум. Причем независимо от возраста и уровня подготовки.
 

Сергей_Ф

Moderator
Команда форума
только я его чуток подправил
для того и дал :). Свою версию вести при активном Вашем обновлении бессмысленно.

позволю попросить добавить и этот код
clock5web.ino перед строкой

WiFi.disconnect();

Код:
#ifdef NO_DS3231
sta_init();

#define WAIT_PERIOD 15000UL // ждём 15 секунд

  uint32_t waiting = millis();
  while ( sta_check() == false && millis()- waiting < WAIT_PERIOD ) {delay(0);}
  if ( sta_check() ) {
    waiting = millis();
    while ( get_ntp_time() == false && millis()- waiting < WAIT_PERIOD ) {delay(0);}
  }
#endif
в ds3231
Код:
//-------------------------------------------------------------- get_ds3231
void get_ds3231()
{
  if ( ds3231_ms == 0 || (cur_ms - ds3231_ms) > SECS_PER_HOUR*1000UL) //3600000UL)
  {
    ds3231_ms = cur_ms;

#ifdef NO_DS3231
    ds3231.Second = second ( cur_time );
    ds3231.Minute = minute ( cur_time );
    ds3231.Hour   = hour   ( cur_time );
    ds3231.Wday   = weekday( cur_time );
    ds3231.Day    = day    ( cur_time );
    ds3231.Month  = month  ( cur_time );
    ds3231.Year   = year   ( cur_time ) -1970;

#else
    // Reset the register pointer
и далее как у Вас
что то я не пойму, как работает регулярное обновление по интернет. У меня работает неправильно, почему то.


И ещё: минуты без ведущего нуля в веб-страничках смотрятся некрасиво, для вывода в виде 01, 00 и т.д. посмотрите в сторону оператора printf (sprintf) и формата "%02", что то типа sprintf(char* minutesForOutput, "%02i", minutes);
или выводить minutes/10 и minutes % 10 друг за другом.

Думаю, Вам будет интересно ознакомиться с thelightclockwifi/lightclockwifi.ino at master · chrismelba/thelightclockwifi · GitHub
там есть выбор сети из списка доступных радио-кнопкой. Это намного удобнее, чем вводить вручную.

Предложения: раз уж часы всё равно тусуются в интернете, то и прогноз погоды не помешает :)
Стоит добавить опрос не одного датчика температуры - дом, улица.
Если откажитесь, сам сделаю :)

P.S. красиво решено для urldecode, однако '+' у Вас обрабатывается некорректно.
 
Последнее редактирование:
позволю попросить добавить и этот код
добавил, но как всегда чуток по своему ). В режиме без DS3231 сделал синхронизацию NTP каждый час.

У меня работает неправильно
а как это проявляется ?

Это намного удобнее, чем вводить вручную
в HTML нет элемента который позволял бы выбирать из списка и вводить вручную текст, т.ч. никак.

то и прогноз погоды не помешает
это 100% делать не буду. Часы должны показывать время а для погоды должна быть метеостанция и т.д.

однако '+' у Вас обрабатывается некорректно
сделал обработку '+' как обычного символа ...
 

Сергей_Ф

Moderator
Команда форума
в HTML нет элемента который позволял бы выбирать из списка и вводить вручную текст, т.ч. никак.
.
Вы не смотрели код по ссылке? Там это реализовано. Список сетей с радио-кнопками и текстовое поле для ввода скрытой сети, если нужно.
А я свой модуль сжег случайно :(. Хотя в мониторе что-то выводит, но дальше не идёт
upload_2016-7-19_12-44-33.png
на даче у меня больше "зверьков" нету, так что перерыв у меня :)
Кстати, если модуль откликается, то процессор жив похоже, только память от перенапряжения выходит из строя, получается.
 

Сергей_Ф

Moderator
Команда форума
я вернулся :).

в HTML нет элемента который позволял бы выбирать из списка и вводить вручную текст, т.ч. никак.
Прям уж никак...? А джава-скрипт на что?
В приложении модификация файла web.ino для выбора сети из списка кликом мышки. Скрытые сети вводятся как и раньше вручную.
Добавил ведущий нолик для минут, а то меня один разряд в минутах сильно раздражает :).
Если что-то позабыл, не пинайте сильно - выложу тогда весь проект.

что должен делать этот кусок кода?
Код:
      for ( int al = 0; al < COUNT_ALARM_CLOCK; al++)
      {
        if ( (alarm_status[al] & 1) > 0)
        {
          // если есть вкл будильник - отключаем
          digitalWrite( alarm_pin, false);
          alarm_status[al] &= 0b11111110;
          pr_alarm = true;
        }
      }
что-то мне кажется что тут ошибки.
Зачем использовалось восьмеричное число 0b11111110 ? Может здесь должно быть двоичное B11111110 или вообще операция сдвига на номер будильника?
Сделайте, пожалуйста, несколько "мелодий" для будильников. Хотя бы, так
Код:
byte          alarm_melody[3] = { B00010101, B00001111, B00011011 };
ну и в теле перебор со сдвигом на число шагов. Получится для [0] "пи-пи-пи-...пи-пи-пи-...", [1] "пииии-....-пииии-...", [2] "пии-...-пии...-пии-...".
Хоть какое разнообразие.
 

Вложения

  • 22.7 KB Просмотры: 105
Последнее редактирование:
добавил ...

что должен делать этот кусок кода?
при срабатывании будильника отключает его кнопкой управления

восьмеричное число 0b11111110
это число не может быть восьмеричным, ардуино IDE воспринимает его как двоичное. А это строка обнуляет младший бит статуса будильника, который отвечает за признак вкл/выкл будильника.

Сделайте, пожалуйста, несколько "мелодий" для будильников. Хотя бы, так
не сделаю, мне тестировать негде.
 

Сергей_Ф

Moderator
Команда форума
это число не может быть восьмеричным, ардуино IDE воспринимает его как двоичное.
Значит тут Целочисленные константы | Аппаратная платформа Arduino неверные данные.
Что то меня заклинило, 0b никак не может быть восьмеричным числом. И, действительно, воспринимается двоичным. Извиняюсь.

Мелодии сам сделаю, тогда. Что-то просто писк без перерывов не по феншую.
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
Мелодии сам сделаю
Сделал. На выбор три типа сигнала для пищалки типа HYDZ для каждого будильника. Один вывод пищалки подключаем на gpio 13, другой на 0 питания. Громкость вполне достаточная.
Только учтите, там ещё много по мелочи правлено. Заменены сервера ntp, усреднено показание датчика освещения, добавлена (неиспользуемая пока) заглушка для прогноза погоды, выводы под Witty настроены - надо править в начале несколько define для разводки автора. По HTML я совсем не силен, возможно нужна правка.
Если кто-то будет править оригинал, то:
Код:
Заменяем web.ino
Добавляем alarmMelodies.h
В структуру alarm_clock добавляем byte signal = 0;
После определения константы const int     alarm_pin      = 13; (alarm_pin      = PIN_ALARM;) подключаем заголовочный файл #include "alarmMelodyes.h"
Поиском меняем все digitalWrite(alarm_pin, true) на signalStep.attach(0.1, signal_step, eeprom_data.alarm[al].signal)
digitalWrite(alarm_pin, false) на signalStep.detach(); digitalWrite(alarm_pin, false)
За исключение раздела setup там оставляем digitalWrite(alarm_pin, false) без изменений.
Вроде всё.
 

Вложения

Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
я бы не советовал так подключать,
безусловно, лучше подключить готовый модуль типа
Высокое Качество Активный Модуль Зуммер для Arduino Новый DIY Комплект Активность зуммер низкий уровень модули
Высокое Качество Активный Модуль Зуммер для Arduino Новый DIY Комплект Активность зуммер низкий уровень модули купить на AliExpress
(from AliExpress Android)
Однако, работает и так :).
 

Сергей_Ф

Moderator
Команда форума
Небольшая модернизация "мелодий" звонка.
1) теперь можно добавлять свои шаблоны "мелодии" в файле alarmMelodies.h
Шаблон (8 бит) модулирует высокий сигнал на выводе PIN_ALARM (13) с шагом 0,1 секунда, начиная с младшего бита. Высокий уровень на выводе соответствует 1, низкий - 0, в соответствующем бите.
Пример: непрерывный писк - B11111111,
писк продолжительностью 0,1 с и скважностью 1/2 - B10101010,
писк продолжительностью 0,4 и скважностью 1/2 - B00001111 или B11110000,
писк продолжительностью 0,3 c и скважностью 3/4 - B11101110, и т.д.
переписываем два файла в проекте и
изменяем число шаблонов [HASHTAG]#define[/HASHTAG] COUNT_ALARM_SIGNAL и добавляем шаблон и имя сигнала в alarm_signal и alarm_signal_name, соответственно.
Добавлены макросы buzzerSignalOn и buzzerSignalOff, которые можно использовать в основной программе вместо оригинальных digitalWrite(alarm_pin, true) и digitalWrite(alarm_pin, false), соответственно.
Компилируем и загружаем в часы.
 

Вложения

Последнее редактирование:
Сверху Снизу