Облако тегов

Глобус

Навигация

Вход на сайт

  • Войти с Twitter

Push-часы с отображением погоды

После того как весь дом напичкан датчика, в интернет и на телефон выводится вся информация, стало понятно, что надо иметь стационарные устройства отображения информации. Так родились настольные PUSH часы с информацией с погодных датчиков. На самом деле  - это пассивный элемент домашней автоматизации, он будет только отображать информацию, переданную ему через wi-fi.

Список элементов, необходимых для работы:

  • Wi- fi модуль ESP8266 + 100р (или $3) для оплаты альтернативной прошивки.
  • 1.8" TFT экран, поддерживаемый библиотекой UTFT.
  • Любой компьютер, способный выполнять PHP скрипты из командной строки. Тот же Raspberry Pi подойдет.
  • Arduino Pro Mini (или любая другая)
  • Корпус по желанию.

Схема подключения очень проста:

ESP Arduino 3.3v  1.8 TFT
VCC,CH_PD VCC vcc,bl
GND GND gnd
RX 4  
TX 5  
  10 cs
  13 sck
  11 sda
  9 rs
  8 rst

 

1. Wi-fi модуль ESP8266

Фото с сайта продавца.

Недавно появились в продаже дешевые Wi-fi модули ESP8266. Накупил их с десяток разных модификаций. Хотел использовать как Wi-fi shields для ардуины. Встроенная прошивка фактически является шлюзом wi-fi<->uart. Управляется простым набором AT команд из терминала. В связке с ардуино пробовал несколько библиотек. Все они работали очень нестабильно. А часть требовали второго аппаратного UART. Поэтому я отложил эксперименты на будущее.

А через некоторое время автор сайта homes-smart начал разрабатывать собственную прошивку для ESP8266. Он проделал огромный труд, сделав возможным использование ESP8266 автономно со многими электронными устройствами.
Такими как датчики температуры, давления, влажности, движения, освещенности. Реализовал протоколы one wire и I2c. Его устройства позволяют работать с электронными счетчиками воды и электроэнергии. Реализована отправка данных на различные серверы в интернет и интеграцию с Majordomo. Вывод информации на несколько типов экранов.

Именно на ESP8266 я делал ранее свою погодную станцию.

В текущем проекте ESP8266 будет использовано только как шлюз для получения данных по wi-fi и передачи их в ардуину. Как прошивать модуль читайте тут.

Для прошивки используйте тот же модуль, которым прошиваете Arduino. Если будут вопросы, спрашивайте, помогу.
Расскажу лишь, что по адресу надо зарегистрироваться, оплатить прошивку, так как модуль UART через GET доступен в только расширенной платной версии. Прошить и активировать прошивку полученным на сайте ключем.
При скачивании прошивки выбрать модули: "UART через GET" и "Обновление через интернет (OTA)". Последний позволит в дальнейшем обновлять прошивку через интернет без USB-UART адаптера.

Для работы модуля необходимо соединить входы CH_PD и VCC. А для входа в режим прошивки необходимо при старте модуля соединить GPIO0 и GND.

После прошивки соедините RX и TX и подайте питание на модуль. Это режим настроки базовых параметров. Подключитесь по wi-fi к модулю (открытая сеть HOMESSMART).
Зайдите броузером по адресу: 192.168.4.1 и во вкладке Main введите адрес и пароль от своей точки доступа и выбирете Station mode (по умолчанию).

Через некоторое время вы увидите IP адрес модуля в вашей сети.

Дальше именно он будет использоваться для работы.
Теперь подключите модуль к ардуино как написано в схеме в начале статьи.

ВАЖНО. Модуль питается от 3.3 вольт. Поэтому я взял 3.3 вольтовую версию Arduino pro mini.

 

2. 1.8 TFT модуль

Фото с сайта продавца.

Модулей разных очень много. Важно выбрать тот, что будет поддерживаться библиотекой UTFT
Ссылки на мой модуль уже нет на aliexpress. Похожий выглядит так.
На плате есть перемычка J1 если она разомкнута, то дисплей работает от 5в. Я ее закоротил, чтобы он работал от 3.3 вольта.

 

3. PHP скрипт для отправки данных.
Тут у кажного будет свой вариант. У меня данные хранятся в базе данных MYSQL да домашнем сервере.
Мой скрипт такой:

<html dir="ltr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    </head>
    <body>

<?php
    $s1_1=date("G");
    $s1_2=date("i");
    $s1_3=date("s");
    if(strlen($s1_1)==1)$s1_1="0".$s1_1;
    if(strlen($s1_2)==1)$s1_2="0".$s1_2;
    if(strlen($s1_3)==1)$s1_3="0".$s1_3;
    
    echo( "ч,мм,сс:<br>".$s1_1.":".$s1_2.":".$s1_3);
    echo "<br>";
    $s2=date("w,j,n");
    echo("день_недели, число, месяц:<br>". $s2);
    echo "<br>";
    
    echo("(внешние) температура, влажность, давление:<br>");
    
    $s3="";
    $sensor_data = GetSensorData('dhtt1');
    if((float)$sensor_data>0) $s3.="+";
    $s3.=$sensor_data;
    $s3.=','.GetSensorData('dhth1');
    $s3.=','.GetSensorData('bmpp');
    echo $s3;
    echo "<br>";

    echo("(комната) температура, влажность:<br>");
    
    $s4="";
    $sensor_data = GetSensorData('dhtt2');
    if((float)$sensor_data>0) $s4.="+";
    $s4.=$sensor_data;

    $s4.=','.GetSensorData('dhth2');

    echo $s4;
    echo "<br>";

    $s_all = "##,".$s1_1.','.$s1_2.','.$s1_3.','.$s2.','.$s3.','.$s4.",##";
    echo "все вместе:<br>".$s_all.'<br>';
                                                      
    $s_hex = 'http://192.168.99.22/uartpro?speed=9600&send='.String2Hex($s_all).'0d0a';
    echo "hex:<br>".$s_hex;
    echo '. размер: '.strlen($s_hex).'<br>';
    
   file_get_contents($s_hex);

 

function String2Hex($string){
    $hex='';
    for ($i=0; $i < strlen($string); $i++){
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

function GetSensorData($sensor_name)
{
    require("settings.php");//here is mysql credential stored
    try
    {  
        $DBH = new PDO("mysql:host=$host;dbname=$database", $user, $pswd);  
        $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
    
        $qry = "SELECT
                  rd.raw_id,
                  rd.device_name,
                  rd.parameter_name,
                  rd.parameter_date,
                  rd.parameter_value,
                  rd.created_datetime
                FROM raw_data rd
                WHERE rd.device_name = 'ESP826600990940'
                AND rd.parameter_name = '".$sensor_name."'
                ORDER BY rd.raw_id DESC
                limit 1
                ";
        $STH = $DBH->query($qry);  
          
        $STH->setFetchMode(PDO::FETCH_OBJ);  
        $value= '';
        while($row = $STH->fetch()) {
            $value = $row->parameter_value;
        }
       
        
        $value = round(floatval(str_replace(",",".",$value)));
 

        if ($value ==NULL ) $value='';
        
        return $value;    
    }  
    catch(PDOException $e)
    {  
        echo "<br>Can't connect to mysql<br>";
        $result = date('d.m.Y H:i:s');
        $result .= ' '.$e->getMessage();
        $result .= PHP_EOL;
        file_put_contents('result.txt', $result, FILE_APPEND);  
    }        
}      
        
?>
           

 

</body>
</html>

Его я вставил в планировщик заданий (для linux - это cron), чтобы он запускался раз в минуту.

Если скрипт размещен на вашем веб-сервере, то его можно открыть в браузере и увидеть отладочную информацию. Что же делает скрипт?

Его основная цель сформировать строку данных вида: ##,10,24,49,1,18,5,+7,85,729,+22,37,##
Где первые три числа - время, вторые три числа - дата, далее температура и влажность на улице, давление, температура и влажность в доме.
После этого строка преобразовывается в шестнадцатеричное представление и формируется строка:
http://192.168.99.22/uartpro?speed=9600&send=23232c31302c32342c34392c312...
где 192.168.99.22 - это адрес ESP8266 в вашей сети, speed=9600  - это скорость передачи из ESP8266 в arduino, а все, что после send=  - это шестнадцатеричное представление строки ##,10,24,49,1,18,5,+7,85,729,+22,37,##.

 

4. Arduino Pro Mini 3.3в

Нам понадобится библиотека UTFT. Добейтесь работы вашего дисплея с ней. Там есть несколько примеров. После того как поймете что за дисплей у вас, откройте в текстовом редакторе файл memorysaver.h и удалите комментарии со всех строк кроме, той, где указан ваш дисплей. Это уменьшит размер библиотеки вдвое, убрав из нее поддержку всех дисплеев, кроме нашего. Иначе не хватит места для нашего кода  - все займет библиотека.

Так как в Arduino Pro Mini только один UART и он используется для ее программирования, то приходится использовать библиотеку SoftwareSerial, которая эмулирует UART.

Скетч для ардуино доступен в конце статьи.

 

5. Корпус.
Его я печатал на 3D принтере. Тут тоже есть смысл взять часть, где крепится дисплей, а остальное отредактированть под свои платы.
Я делал для себя, под свою плату, под свои размеры. Файлы STL и исходники в формате Solidworks доступны для скачивания тут.

Вот такие получились push-часы.

 

 

 

Комментарии

Здравствуйте,скажите пожалуйста а библиотека UTFT у Вас русифицирована?

Да, библиотека русифицирована. Я ее не выкладывал, поскольку там закоментарены все дисплеи кроме моего.

Я только мелкие шрифты использовал. Инфу по русификации посмотрите тут: http://devicter.blogspot.ru/2013/03/rusUTFT-SmallFont.html.

Еще  Вы писали "Именно на ESP8266 я делал ранее свою погодную станцию.",не могли бы Вы поделиться проектом?

Про погодную станцию даже писать особо нечего. Там просто плата ESP8266 с температурами, влажностью и давлением. Прошивка ESP такая же как и в этой статье. Как подсоединять все и прошивать смотрите здесь: http://homes-smart.ru/index.php/oborudovanie/bez-provodov-wi-fi/62-besprovodnoj-datchik-na-baze-esp8266-dlya-servisa-narodmon-ru. Если что не понято будет, спрашивайте.

Спасибо за ответы,станцию я собрал таку же с сайта http://homes-smart.ru/,не могу понять как Вашими часами совместить 

Сорри за долгий ответ. Неделька тяжелая выдалась.

Часы сами не умеют получать данные. Их туда "пихает" мой сервер. Данные на ESP передаются get-запросом с моего сервера. Без отдельного сервера пока все это не работает. Не могу научиться получать данные в ардуину с esp8266. Данная прошивка это не умеет, а родная с AT командами очень глючная.

Я запрос со своего сервера генерю с помощью php по расписанию раз в минуту. По расписанию выполняется раз в минуту команда вида: /usr/bin/php /var/www/rim/objects/push_weather.php. Вы можете переделать мой php и сделать немного проще. Данные брать с вашей погодной станции запросом http://_ip_/sensors/. Добавлять туда время, если его там нет формировать строку как у меня и отправлять в esp8266. Почему сам так не сделал не понимаю :)

Кстати, если разберетесь с родной прошивкой ESP с AT командами и научитесь делать GET запросы и данные передавать в ардуину, поделитесь инфой. У меня терпения не хватило. Так конечно было бы проще. Время взять из интернета, погоду с погодной станции и готово. Отдельный сервер не нужен тогда. Тогда и прогноз погоды можно было бы выводить с какого-либо сайта.

 

Для теста в браузере введите http://192.168.99.22/uartpro?speed=9600&send=23232c31322c31312c30322c352...

поменяв адрес на свой. На часах будет 12:11 пт 12 июня и погода.

Спасибо Вам за информацию

Добавить комментарий