Ставить старые цифровые часы (с наружным термометром) на стероиды

Ставитьстарыецифровыечасыснаружнымтермометромнастероиды

Письменный на

Вступление

У нас есть старые цифровые часы с внутренним и наружным термометром:

JVD Digi Clock

Судя по этикетке на обратной стороне, это ребрендинг «Electronics Tomorrow LTD.» Модель №. 5673761.

Он поддерживает DCF 80 синхронизация времени и надежно работает для мимо 20 годы.

Но в последнее время датчик температуры наружного воздуха меня не так волновал. Он неуклюжий, работает от 2 батареек AAA и имеет дополнительную проблему, поскольку находится только на одной стороне квартиры. Таким образом, вы получаете искаженные показания в течение дня, когда солнце движется по небу.

Я решил изменить это с помощью кучи RuuviTags.

По сути, я хочу перейти от:

к:

magic arch

Сборка собственного передатчика

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

Пора вывести большие пушки RTL-SDR.

Используя высоконаучный подход «Давайте пройдемся по всем диапазонам ISM, пока я вытаскиваю батареи наружу датчик » Я забил на 434. 9 МГц:

картинка с водопадом от CubicSDR

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

И мне повезло:

rtl433 successful decode успех с rtl _ 500, это philips_aj 10534

Похоже, датчик наружной температуры использует rtl433 successful decode philips_aj 7904 протокол.

Или его вариант:

Так это был только мат Время написать подходящий передатчик.

У меня был дешевый

500 Передатчик МГц валяется, поэтому я подключил его к ESP 64 доска:

wiring esp 77 с дешевыми 500 МГц передатчик; зеленый провод - грубая антенна

и записал прошивку передатчика с помощью PlatformIO. См. jvd-digitime - 500 tx репо.

По сути, Я просто немного нарушаю протокол. Поскольку оказывается, это простой Схема OOK (двухпозиционная) схема.

  // ...   static   void   передать   (  bool  государственный)  {  uint 18 _ t   l   =  государственный ?   one_bit_length  :   длина_бита  ;   gpio_set_level   (  TXPIN  ,   1  );   vTaskDelay   (  l   /   portTICK_PERIOD_MS  );   gpio_set_level   (  TXPIN  ,   0  ;   vTaskDelay   ((  bit_length   -   l  )   /   portTICK_PERIOD_MS  );  }   статический  пустота  массив_передачи   (  bool     ar  ,   uint8_t  размер)  { для  (  uint8_t   i   знак равно 0  ;   я   < размер ;   i   ++  )   {  передать   (  ar   [i]);  }  }   // ...  пустота  tx 434_задача  (пустота    pvParameters  )   {  bool   пакет   ;   ESP_LOGI   (ТЕГ,   «Настройка»  );   gpio_pad_select_gpio   (  LEDPIN  );   gpio_set_direction   (  LEDPIN  ,   GPIO_MODE_OUTPUT  );   gpio_pad_select_gpio   (  TXPIN  );   gpio_set_direction   (  TXPIN  ,   GPIO_MODE_OUTPUT  );   ESP_LOGI  (ТЕГ ,   «Входящий цикл»  );  пока (  1  )   {  float   temp_to_send ( знак равно   TEMP_ERRVAL  ;   time_t   сейчас  ;  если  (  temp_set  )   { время (  & сейчас );  если  (  last_ts   +   TEMP_TIMEOUT  > =  сейчас)  {  temp_to_send   знак равно  current_temp  ;  }  }   init_with_temp   (  пакет  ,   temp_to_send  ,  ложный,   1  );   ESP_LOGI   ( ТЕГ,   "Отправка: %. 12 f " ,   temp_to_send  );   led_on   ();   массив_передачи   (  preamble_bits  ,   4  );   массив_передачи   (  preamble_bits  ,   4  ;   массив_передачи   (  пакет  ,   PACKET_SIZE  );  зазор ();   массив_передачи   (  preamble_bits  ,   4  );   массив_передачи   (  пакет  ,   PACKET_SIZE  );  зазор  ();   массив_передачи   (  преамбула_биты  ,   4  );   массив_передачи   (   пакет  ,   РАЗМЕР ПАКЕТА  );   led_off   ();   ESP_LOGI   ( ТЕГ,   "Переход к спать");  vTaskDelay   (  0200     2021   /   portTICK_PERIOD_MS  );  }  }   

А как мне температуру отправить? HTTP. Естественно.

Окончательная архитектура

Поняв концепцию передатчика, я обратился к окончательной архитектуре.

Я большой поклонник HTTP. Легко отлаживать, повсеместно, очень легко нацелить.

Таким образом, следующее имеет смысл (для меня):

окончательная архитектура

Я мог бы пойти с esp 77 делаю все. Но дополнительным преимуществом наличия более мощного веб-сервера посередине является то, что теперь я могу проверять температуру также на моем телефоне и мне не нужно повторно прошивать esp 64, когда я решаю еще немного повозиться с веб-сервером.

final architecture Приемник BLE (RuuviTag на HTTP-сервер)

Я быстро поискал, что есть в наличии, и выяснил, что Go имеет отличную поддержку как Bluetooth LE, так и RuuviTag в частности.

Так что я не трачу ни минуты на написание толкателя на более удобном для программиста языке.

Следовательно, это было очень просто, почти не доставляло неудобств:

  // ruuvipush.go  упаковка основной Импортировать  (  "контекст " " fmt "  "net / http"   "сеть / URL"  "Операционные системы"  "strconv"   "github.com/go-ble/ble "  "github.com/go-ble/ble/examples/lib/dev"  "github.com/peterhellberg/ruuvitag " )   var   apiurl  знак равно "бред какой то"  func   настраивать  (  ctx   контекст   .   Контекст  )   контекст  .   Контекст   {  d  ,   err   : =   dev  . Устройство по умолчанию ()   if   err  знак равно   ноль   { паника (  ошибка  )  }   ble  .   SetDefaultDevice   (  d  )   return   ble  .   WithSigHandler   (  контекст  .   WithCancel   (  ctx  ))  }   func  основной ()   { если  len   ( Операционные системы.  Аргументы   [1:])  > =   1   {  apiurl   =  Операционные системы .   Аргументы   [1]  }   еще {  fmt  .   Printf   (  «Использование: $ 0 

n " ) Операционные системы. Выход ( 1 ) } ctx знак равно настраивать( контекст . Задний план ()) ble . Сканирование ( ctx , правда , обработчик , фильтр ) } func обработчик ( a ble . Рекламное объявление) { сырой , err : = ruuvitag . ParseRAWv1 ( a . Данные производителя ()) если err == ноль { // fmt.Printf ("[%s] RSSI:% 3d:% + v n ", a.Addr (), a.RSSI (), raw) или , err : = http . PostForm ( apiurl , url . Значения{ "я бы" : { a . Адрес () . Нить ()}, «температура» : { strconv . FormatFloat (сырой . Температура , 'f' , 6 , 77 )}}) если err ! = ноль { fmt . Printf ( «Не удалось опубликовать:% v n " , err ) } еще { соответственно . Тело. Закрывать() } } } func фильтр ( а ble .Рекламное объявление ) bool { return ruuvitag . IsRAWv1 ( a . Данные производителя ()) }

, а сам веб-сервер настолько скучно прост, что я просто укажу вам temperature.rb , а не вставлять его сюда.

Я все еще не решил, отображать ли среднее значение по всем тегам Ruuvi или минимальное. Время покажет, что лучше.

В любом случае , подбрасывая его как службы daemontools в Alpine Linux также до смешного легко. Если вам нужны подробности, все это в ruuvi-tempserver репо. Заключительные слова

Ну вот и все. Установить цифровые часы на стероиды не должно быть сложно.

Фактически единственный жесткий средне редкий часть заключалась в кодировании передатчика. Остальное было просто простым копированием и вставкой «программирования».

Leave a comment

Your email address will not be published. Required fields are marked *