Arduino, ESP8266 Lua, Raspberry Pi 2 && OpenHab. Умный дом: азы управления.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 май 2015.

  1. ИгорьК

    ИгорьК Гуру

    Славно. Занчит придется разбираться самому. Результатом, надеюсь, поделитесь :)
     
  2. ИгорьК

    ИгорьК Гуру

    48. ESP-8266. Модуль DS8b20 с задержкой и выгрузкой.
    Причина переработки модуля:
    • необходимость задержки 750 мс при паразитном питании и 50 мс при обычном питании;
    • обеспечение выгрузки модуля;
    • обеспечение удобной работы с несколькими датчиками.
    Работа с модулем проста. Его надо загрузить, передать ему необходимые данные и все.
    Код (Lua):
    do
        -- Таблица, где будет температура
        temp = {}
        -- Нога, где датчики
        pin = 4
        -- Задержка чтения. Для паразитного - 750, для обычного - 50
        del = 750
        -- Функция будет выполняться после получения температуры
        function myWork() print("Got DS18b20: "..#temp); table.foreach(temp, print)end
        -- Функция выгрузки модуля
        function unload() ds = nil end
        -- Загружаем модуль
        ds = require('ds18b20m')
        -- Читаем температуру в таблицу "temp", где она и остается, и выгружаем модуль
        ds.getTemp(pin, del, temp, myWork, unload)
    end
    Или коротко:
    Код (Lua):
    temp = {}
    function myWork() print("Got DS18b20: "..#temp); table.foreach(temp, print)end
    function unload() ds = nil end
    ds = require('ds18b20m')
    ds.getTemp(4, 750, temp, myWork, unload)
    Можно еще проще - вызывать getTemp без unload.
    В этом случае модуль не выгружается и при вызовах не перечитывает адреса датчиков, что экономит время (но не память):
    Код (Lua):
    temp = {}
    function myWork() print("Got DS18b20: "..#temp); table.foreach(temp, print)end
    ds = require('ds18b20m')
    ds.getTemp(4, 750, temp, myWork)
    Три датчика на шине, модуль выгружается:
    dss1.jpg
     

    Вложения:

    • ds18b20m.zip
      Размер файла:
      818 байт
      Просмотров:
      318
    Последнее редактирование: 12 янв 2017
    alp69 нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Вынес в заголовок вместе с 30 пунктом.
     
  4. faster_light

    faster_light Нерд

    Пока идут мои nrf24l01 для работы над uart решил разобраться с mqtt на esp8266 на платформе Arduino IDE.
    Я видел тут кто-то интересовался, да и я сам искал, привожу пример прошивки, может еще кому-то пригодится.
    Код (C++):
    // Светодиод подключен к 5 пину

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>

    const char *ssid =  "xx";  // Имя вайфай точки доступа
    const char *pass =  "xx"; // Пароль от точки доступа

    const char *mqtt_server = "xx"; // Имя сервера MQTT
    const int mqtt_port = 1234; // Порт для подключения к серверу MQTT
    const char *mqtt_user = "xx"; // Логин от сервера
    const char *mqtt_pass = "xx"; // Пароль от сервера

    #define BUFFER_SIZE 100

    bool LedState = false;
    int tm=300;

    // Функция получения данных от сервера

    void callback(const MQTT::Publish& pub)
    {
      Serial.print(pub.topic());   // выводим в сериал порт название топика
      Serial.print(" => ");
      Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных

      String payload = pub.payload_string();

      if(String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные
      {
      int stled = payload.toInt(); // преобразуем полученные данные в тип integer
      digitalWrite(5,stled);  //  включаем или выключаем светодиод в зависимоти от полученных значений данных
      }
    }

    WiFiClient wclient;    
    PubSubClient client(wclient, mqtt_server, mqtt_port);

    void setup() {

      Serial.begin(115200);
      delay(10);
      Serial.println();
      Serial.println();
      pinMode(5, OUTPUT);
    }

    void loop() {
      // подключаемся к wi-fi
      if (WiFi.status() != WL_CONNECTED) {
        Serial.print("Connecting to ");
        Serial.print(ssid);
        Serial.println("...");
        WiFi.begin(ssid, pass);

        if (WiFi.waitForConnectResult() != WL_CONNECTED)
          return;
        Serial.println("WiFi connected");
      }

      // подключаемся к MQTT серверу
      if (WiFi.status() == WL_CONNECTED) {
        if (!client.connected()) {
          Serial.println("Connecting to MQTT server");
          if (client.connect(MQTT::Connect("arduinoClient2")
                             .set_auth(mqtt_user, mqtt_pass))) {
            Serial.println("Connected to MQTT server");
            client.set_callback(callback);
            client.subscribe("test/led"); // подписывааемся на топик с данными для светодиода
          } else {
            Serial.println("Could not connect to MQTT server");
          }
        }

        if (client.connected())
        {
          client.loop();
          dataSend();
        }
    }
    } // конец основного цикла

    // Функция отправки данных

    void dataSend(){
      if (tm==0)
      {
      client.publish("test/data","your data"); // отправляем данные в топик
      tm = 300;  // пауза меду отправками значений температуры  коло 3 секунд
      }
      tm--;
      delay(10);
    }
    Недостающая библиотека в прикрепленном файле
     

    Вложения:

    alp69 и ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Они же по SPI?
     
    faster_light нравится это.
  6. faster_light

    faster_light Нерд

    Точно! В любом случае вижу связку nrf24l01 <-spi-> arduino <-uart-> RPI
    Выходит пора начинать!
     
  7. ИгорьК

    ИгорьК Гуру

    Жуть. Я только в исключительном случае взялся бы за NRF. Тему про них мою глядели?
    Кстати, ардуино с малиной по UART соединять надо КАТЕГОРИЧЕСКИ с согласованием уровней.
     
  8. faster_light

    faster_light Нерд

    Глядел, вы да и не только вы, описывали всю ту боль, что сопровождает эти модули. Даже и не знаю зачем они мне, когда есть esp8266. Однако не пропадать же заказанному добру.

    По уровням знаю, сейчас сделал только одностороннюю связь малина -> ардуино. Приходится каждый раз снимать проводок при прошивке ардуино.

    Есть неплохие и недорогие платы по согласованию уровней, но опять же, когда они придут неизвестно. Поэтому делитель напряжения - наше всё.

    Но спасибо за предупреждения)
     
  9. ИгорьК

    ИгорьК Гуру

    После них, я и взялся за изучение esp-8266. Тогда ардуинщики на него еще не напали, и программировался он или в чистом Си или Lua.
    Вот я и вцепился в его изучение.
    Сейчас только Lua и JavaScript: Искра JS после этого сложной не кажется. А ардуино - по необходимости.
    В общем, рекомендую, попробуйте.
    Мышление перестраивается и после Lua и JS Си(шные) мытарства кажутся ... излишними. Мало задач, где нужна истинная точность Си.
     
  10. Karakurt

    Karakurt Нерд

    Столкнулся с такой проблемой.
    Железка: ESP8266 D1 mini
    IDE: Arduino IDE

    На маке прошивается без проблем.
    А вот под linux (ubuntu) выдает:
    Код (Text):
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed
    решение проблемы - закоротить ногу D3 (она же GPIO0) на землю.

    Может кому-то поможет.
     
  11.  
  12. Доброго времени суток
    Подскажите новичку у меня openHub выдает текст вот так
     

    Вложения:

    • fwhyh.jpg
      fwhyh.jpg
      Размер файла:
      96,5 КБ
      Просмотров:
      838
  13. ИгорьК

    ИгорьК Гуру

    Полагаю, следует убедиться, кто кодировка при редактировании файлов OpenHab есть UTF-8 без BOM.
    А также установить локали.

    Ashampoo_Snap_2017.01.12_20h40m03s_001_.jpg
     
  14. Локали в норме кодировка файлов итемов и сайтмап utf-8(без ROM)
    Может подскажите какие файлы еще проверить?
     
  15. alp69

    alp69 Форумчанин

    Вам, полагаю, эта строка приходит извне?
     
  16. Да из вне
    https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml
    вот итем
    Код (C++):
    Number    YandexTemp    "Температура [%.1f °C]"    <temperature>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:30000:REGEX(.*?<temperature.*?>(.*?)</temperature>.*?)]" }
    Number    YandexHumi    "Влажность [%s %%]"    <water>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:120000:REGEX(.*?<dampness>(.*?)</dampness>.*)]" }
    Number    YandexWind    "Ветер [%.1f м/с]"    <wind>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:120000:REGEX(.*?<wind_speed>(.*?)</wind_speed>.*)]" }
    Number    YandexPress    "Давление [%s mm.Hg]"    <weather_baraometric_pressure_hg>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:120000:REGEX(.*?<torr>(.*?)</torr>.*)]" }
    String    YandexType    "За окном [%s]"    <window>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:120000:REGEX(.*?<weather_type>(.*?)</weather_type>.*)]" }
    String    YandexRise    "Восход [%s]"    <sun>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:120000:REGEX(.*?<sun_rise>(.*?)</sun_rise>.*)]" }
    String    YandexSet    "Закат [%s]"    <mun>    { http="<[https://export.yandex.ru/bar/reginfo.xml?region=$11091.xml:120000:REGEX(.*?<sunset>(.*?)</sunset>.*)]" }
     
     
  17. ИгорьК

    ИгорьК Гуру

    Не погреб - космический корабль:
    004.jpg
     
    Последнее редактирование: 16 янв 2017
    alp69 нравится это.
  18. mex79

    mex79 Нерд

    Влажность на улице 102% :eek:
     
  19. ИгорьК

    ИгорьК Гуру

    HIH5000 дают такие показания при влажности, приближающейся к максимуму.
    Оттормаживать прграммно не стал, но фильтр Калмана прикрутил.
     
    Последнее редактирование: 16 янв 2017
    mex79 нравится это.
  20. mex79

    mex79 Нерд

    Нашел вашу тему по тесту DHT, теперь понятно почему у меня вдруг влажность на улице постоянно висела 99% причем питание я проверял, в том числе от лития цеплял. Сейчас перенес датчик в дом, показания по влажности снизились, но недоверие к ним осталось )