Arduino Yún, Народный мониторинг: управление отоплением в загородном доме через Интернет.

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

  1. ИгорьК

    ИгорьК Гуру

    UPD: Развитие вопроса здесь.

    Эта тема больше не поддерживается - новое решение приведено по ссылке выше. Причину смотреть здесь.

    Без активного участия пользователя Фисташка Трям этот проект сильно тормозился.
    Сначала видео:


    Устройство работает по этому адресу, где каждые 10 минут (в минуты, оканчивающиеся на 4, - проверьте) передает данные на Народный Мониторинг. Поскольку сервер разрешает показывать только уличные значения, Вы увидите лишь две цифры: уличная температура и ветер. Показания анемометра пока не отражаются - банально не хватило провода для подключения. В ближайшее время анемометр появится в отображении.
    Графический термометр отображается вот здесь.
    Устройство мониторит три датчика DS18B20. Никаких датчиков давления, влажности и прочей пурги включать не стал, поскольку не понимаю их практическую ценность в домашнем хозяйстве. Только температура и ветер.
    Три датчика - это оптимально, и вот почему. Температуру следует знать на улице, в доме и в системе отопления. Причем контроль в системе отопления - наиболее значим в зимнее время. Ветер... ну те, кто увлекается авиа/вертолето/коптероводством меня поймут. Ой как давно хотел знать о ветре.
    Если анемометр не входит в Ваши планы, можно подключить какой-то аналоговый датчик, или вообще забить на эту часть дела.
    Это первый вариант.
    Расширенный вариант подразумевает управление реле. Это для тех, у кого отопление электрическое. Причем температуру можно устанавливать через Интернет, а также писать задания по изменению температуры в автоматическом режиме, в зависимости от дня недели и времени суток.
    Все это богатство отражается не только на сервере, поднимаемом Yun, сайте Народного Мониторинга, но и на экране смартфона, приблизительно в таком виде:
    Screenshot_3.png Screenshot_2.png
    Народный мониторинг позволяет отправлять уведомления хозяину о критических состояниях датчиков как по почте, так и через СМС. (При некоторой сообразительности это можно использовать и для охраны помещения)


    ====================================
    Почему Arduino Yun? ИМХО, в определенном случае это более экономичное решение, а именно - если вы вынуждены прибегать к установке контроллера в таком месте, куда кидать провод неэстетично или невозможно. В таком случае, Yun стоит меньше, чем Uno + Wi-Fi Shield + Raspberry Pi , чему приблизительно и равна Yun.

    Почему не эта замечательная тема? У нее один недостаток, не связанный с ней самой. Если у вас есть дача, и вы начинаете задумываться о дистанционном управлении отоплением, то, наверняка еще до этого установили какую-то сигнализацию. Для нее нужна сим-карта, и вся морока, связанная с оплатой и наблюдением за балансом. Тема умножает проблему на два.
    С другой стороны, благодаря стараниям разных операторов, площади покрытия Интернетом неуклонно увеличиваются. И если у вас он есть - грех не воспользоваться случаем.
     
    Последнее редактирование: 8 дек 2015
    Пушной звер нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Внимание! Для тех, кто только начинает осваивать ардуино, сделана вот эта тема.
    Прежде чем сходу пытаться повторить этот проект, прошу повторить все то, что описано в ней. Добейтесь результатов в ней, и эта не будет казаться сложной.
    Оставляю за собой право не отвечать на определенные вопросы, ответы на которые есть здесь.

    Соединяем все так:
    Drawing4.png
    Работать с датчиками будем по трем проводам. Товарищи, гораздо опытнее чем я, расскажут, что надо использовать паразитное питание, чем сэкономить один проводок.
    Тихо возражу: при паразитном питании для вычисления температуры необходима туча времени: не менее 750 мск. и все это время датчики нельзя обижать. При нормальном питании это ограничение отсутствует.
    Кроме того, датчики неплохо бы соединять вот таким шлейфом:
    [​IMG]
    У меня он уже две зимы проработал на улице без проблем, причем уличная длинна его метров шесть.
    А этот шлейф продается не менее чем по 9 жил, что равно 3х3. Ну так и чего экономить? Ради спортивного интереса?
     
    Последнее редактирование: 20 дек 2014
  3. ИгорьК

    ИгорьК Гуру

    Совершаем очередной подвиг:
    1. Обновляем образ OpenWrt-Yun.
    2. Расширяем объем памяти.
    3. Устанавливаем LAMP.
    Если указанного здесь и далее Вам маловато для практического руководства, переходим в эту тему. Я специально написал ее для тех, кто чувствует себя не слишком уверенно.
    Выполняем все до 6 поста включительно.
     
    Последнее редактирование: 19 дек 2014
  4. ИгорьК

    ИгорьК Гуру

    Устройство будет работать по схеме, подробно описанной в седьмом посте. Здесь привожу ссылку и краткое описание.
    Drawing5.png
    Ардуино обрабатывает датчики, и через shell вносит показания в базу данных mysql. Страница index.html, путем ajax запроса, получает данные из базы через страницу mysql.php, а через страницу click.php вносит в базу данные о температуре, которую требуется поддерживать.
    Cron каждые 10 минут отправляет данные на сайт народного мониторинга.
     
    Последнее редактирование: 19 дек 2014
  5. ИгорьК

    ИгорьК Гуру

    Создадим базу mysql, для чего воспользуемся следующими командами:
    Код (Text):
    CREATE DATABASE narodmon;

    CREATE TABLE narod (
    id INT NOT NULL AUTO_INCREMENT,
    intemp FLOAT,
    outtemp FLOAT,
    systemtemp FLOAT,
    wind FLOAT,
    gettemp FLOAT,
    whentime TIMESTAMP,
    PRIMARY KEY(id)
    );

    GRANT ALL ON narodmon.* TO 'user'@'localhost' IDENTIFIED BY 'pass';
    Имя пользователя и пароль устанавливайте самостоятельно.

    Пора в ардуино загрузить скетч. Вот он:
    Код (C):
    #include <Bridge.h>

    #include <OneWire.h>
    #include <stdint.h>

    #define PIN_1WIRE 2
    #define PIN_WIND A3

    OneWire  ds(PIN_1WIRE);  // on pin 10 (a 4.7K resistor is necessary)
    float temperature[3], *pTemperature;
    String sendTemperature = "";

    Process tempeature_alter;  // Выащил - заработало!
    Process wind_alter;

    void setup(void) {
        Bridge.begin();
        pTemperature = temperature;
    }

    void loop(void) {
        sendTemperature = "";
        GetTemperature(pTemperature);
        for (byte i=0; i<3; i++){
            float tt = temperature[i];
            sendTemperature += (String) tt;
            if (i <2) {
                sendTemperature += " ";
            }
        }


        const String sendTT = sendTemperature;
        tempeature_alter.runShellCommand("sh ~/all.sh "+sendTT);
        while( tempeature_alter.available());            // Тормоз для устройчивой работы
        float windGotNow = GetWind();
        const String sendWind=String(windGotNow);
        wind_alter.runShellCommand("sh ~/wind.sh "+sendWind);
        while( wind_alter.available());                    // Тормоз! После него все работает и не виснет!
        delay(30000);                                    // Да, да! Тупая остановка! А есть варианты чем заняться?
    }

    void GetTemperature (float * temperatureAddress) {

      byte i ;
      int tempCounter = 0;
      byte present = 0;
      byte data[12];
      byte addr[8];
      float celsius;

      while (1) {
          if ( !ds.search(addr)) {
            ds.reset_search();
            delay(250);
            return;
          }
          ds.reset();
          ds.select(addr);
          ds.write(0x44, 1);      
          delay(1000);
          present = ds.reset();
          ds.select(addr);
          ds.write(0xBE);      

          for ( i = 0; i < 9; i++) {        
            data[i] = ds.read();
            Serial.print(data[i], HEX);
            Serial.print(" ");
          }
          int16_t raw = (data[1] << 8) | data[0];
          celsius = (float)raw / 16.0;
          if (tempCounter < 3) {
            *(temperatureAddress + tempCounter) = celsius;
          }
          tempCounter++;
      }
    }

    float GetWind() {
        int sensorValue = analogRead(PIN_WIND);
        float outvoltage = sensorValue * (5.0 / 1023.0);
        float windNow = 6*outvoltage;//The level of wind speed is proportional to the output voltage.
        return windNow;
    }
     
     
    Последнее редактирование: 19 дек 2014
    acos нравится это.
  6. ИгорьК

    ИгорьК Гуру

    В папку /srv/www/ распакуем соответствующий архив.
    Также поступаем с папкой /root/ распакуем и туда архивчик.
    Заходим в нашу Yun по 80 порту, Настройки => advanced configuration panel (luci) => вкладка System =>
    Scheduled Tasks и заносим туда строку:
    2,12,22,32,42,52 * * * * sh /root/send.sh
    Нажимаем кнопку Submit, вверху - Logout. Перезагружаем Yun.
    Теперь по адресу http://192.168.ххх.ххх:81/ должны наблюдать такую картинку:
    2352.png

    Каждые 10 минут система начнет отправлять данные на Народный мониторинг.
    Но народный мониторинг эти данные ПРИНИМАТЬ НЕ БУДЕТ!
    Все потому, что вы должны изменить строку в файле sendnarodmon.php в папке root.
    Вот эта строка:
    fwrite($fp, "xx-xx-xx-xx-xx-xx\n#xxxxxxxxxx#$tempin\n#xxxxxxxxx#$tempout\n#xxxxxxxx#$tempsystem\n#xxxxxxxxx#$wind\n##");
    Видите все эти хх? Вот их то и надо заменить на цифры. А как это сделать точнее - смотрите на странице http://narodmon.ru/ кнопка "справка" -" передача показаний".
    Но если коротко - просто замените иксы на разные цифры. Самая первая группа иксов, шесть пар через тире - условный мак-адрес вашей платы. Его запомните - он нужен при регистрации на народном мониторинге и получении прав управления своим устройством на сайте.

    UPD: для папки root файл rootroot.zip
     

    Вложения:

    • www.zip
      Размер файла:
      211,1 КБ
      Просмотров:
      244
    • rootroot.zip
      Размер файла:
      1,4 КБ
      Просмотров:
      377
    Последнее редактирование: 19 дек 2014
  7. ИгорьК

    ИгорьК Гуру

    О текущем состоянии проекта.
    Написан вполне рабочий код, который управляет 13 ногой ардуины в соответствии с заданными параметрами. Через веб-морду можно устанавливать необходимую температуру. Все крутится. На видео это отражается.
    Но возникла засада. Дача висит на Yota интернете. IP-шник у дачи - серый. Думаю, у подавляющего большинства аналогично.
    То есть зайти на сервер, понимаемый внутри дачной сетки, снаружи - не возможно.
    Решений два.
    1. Поднимать сервер где-то на стороне и работать с ним.
    2. Делать VPN-канал между дачей и...?
    И то и другое требует времени и ресурса, а мне реально не нужно, потому что котлом управляет его родная автоматика.
    Таки образом. Проект я замораживаю. Данные на Народный Мониторинг он отправляет, внутри сетки картинки показывает, 13 ногой ардуины управляет. Дальше его развитие не предполагается.
     
  8. x40000

    x40000 Нуб

    Решение третье
    Настроить любой Dynamic DNS на роутере и пробросить порт до устройства


    Решение четвертое
    Пробросить порт с роутера до устройства, а с устройства посылать запросы на DynamicDNS

    1) Регистрируемся на сайте dnsdynamic.org
    2) Получаем логин и пароль, и выбираем адрес например moyhost.ole32.com
    3) С устройства периодически делаем запрос вида https://username:password@www.dnsdynamic.org/api/?hostname=moyhost.ole32.com

    4) Обращаемся к устройству из интернета по адресу moyhost.ole32.com: port
    где port– номер порта на роутере, который пробросили
     
  9. ИгорьК

    ИгорьК Гуру

    Ну да. Сказанное мной правда, но частичная. Кроме этого проект приостановлен еще и по третей причине: не было устойчивых и недорогих конечных модулей управления и сбора информации. Теперь они есть. Так что через некоторое время проект будет продолжен.
     
  10. ИгорьК

    ИгорьК Гуру

    А Вы точно знаете что такое серый айпишник?
     
  11. ИгорьК

    ИгорьК Гуру

    Благодаря появлению модуля ESP8266 этот проект чуть ожил.
    Сейчас к Yun подключены два устройства: первое и второе.
    Оба устройства методом GET через php странички в Yun загоняют информацию в mysql табличку, информация из которой затем скриптом отправляется на narodmon.ru.
    012.png
    Датчики температуры на ESP8266 - блуждающие. Их удобно устанавливать в любом месте для более точного понимания что там происходит.
     
  12. Telek

    Telek Нерд

    У меня пока в протатипе(не на боевом дежурстве) примерно такой же по функционалу набор(передаем телеметрию, получаем команды, только не на отопление - а на полив). "Сердцем" является esp8266. Она собирает данные с датчиков: температуры, давления, количества осадков. Передает данные через Йоту(кстати, Йота отлично работает в бесплатном режиме 64к и не блокирует мелкий http трафик своей стартовой страницей - т.е. Йота это реально бесплатный канал передачи телеметрии и получения команд... Если, конечно, хотя бы раз в год пользоваться йотой за денюжку), при этом esp8266 предварительно включает роутер с йотой, забирает команды которые необходимо выполнить.
    Телеметрию и команды еспэха передает/забирает через сайт thingspeak.
     
  13. ИгорьК

    ИгорьК Гуру

    Ну... дык код давайте! Чего там стесняться :)
     
  14. Telek

    Telek Нерд

    Как отлажу - выложу. Пока не все пришло. Сегодня пришел датчик количества осадков. До этого я его кнопкой эмитировал. Теперь калибровать нужно, чтобы в мм переводить. Жду мелкий роутер, сейчас отлаживаю на роутере со встроенным аккумулятором, а мне аккумулятор не нужен, т.к. хочу роутер включать только на сеанс связи. Чтобы повысить автономность. В прошлом году использовал полив с таймером(автомобильный аккумулятор+насос 12в+таймер). Минус в том, что не возможно угадать будут ли осадки во время отсутствия и какой интенсивности. Приходилось ориентироваться на прогноз погоды и выставлять таймер. В этом году уже буду знать фактическое количество осадков, температуру и буду давать команду на полив исходя из фактических данных.
     
  15. ИгорьК

    ИгорьК Гуру

    Зачем количество осадков? Не проще ли мерить влажность почвы?
     
  16. Telek

    Telek Нерд

    Тут несколько моментов:
    1. Влажность почвы мне нужно измерять на достаточном удалении от устройства (туда протянут шланг, а провода оттуда тянуть не хочется. Измерять влажность в другом месте не возможно, т.к. отличаются условия: то что мне нужно поливать - это огурцы в бочках(там существенно быстрее осушается почва). Заморачиваться с беспроводным датчиком влажности - оно того не стоит... по крайней мере пока на это время терять не хочется).
    2. Количество осадков дает больше информации: можно предположить влажность, можно прикинуть наполнились ли бочки для полива водой. Я знаю по прошлогоднему опыту производительность насоса для полива. Я всегда могу предположить, сколько у меня в запасе воды и сколько нужно потратить. Опустошение бочек я могу вычислить по косвенным признакам - не включится насос(он с поплавком), включение насоса я могу определить по падению напряжения.
    Да и датчик уже пришел, я его прикрутил - работает. Датчик такой. Там геркон и магнит. Из всех заморочек с ним - подавить дребезг. Его я вроде победил.
     
    ИгорьК нравится это.
  17. ИгорьК

    ИгорьК Гуру

    1. Не очень понял про огурцы в бочках. Если идет дождь, то он идет везде - какая разница где измерять важность? Почва будет плюс/минус везде одинаковая, если вопрос не касается парника. А разность осушения всегда можно прикинуть.
    2. Спасибо за ссылку на датчик, реально. Хорошая идея - переделаю свой. Однако определять количество воды расчетным путем - круто, уважаю :)
     
  18. Telek

    Telek Нерд

    Бочки наполнены грунтом и стоят на земле, в бочках растут огурцы. Бочки лучше прогреваются, и соответственно больше влаги испаряется(это некая альтернатива парнику - с одной стороны они не закрыты сверху - а значит есть естественный полив(не нужно каждый день поливать), с другой стороны они лучше прогреваются чем почва, меньше росы, проще собирать огурцы - они свисают с бочек). Поэтому влажность почвы в бочках, сильно отличается от влажности почвы на уровне земли. Датчики влажности в бочки я не могу установить - далеко тянуть провода. Измерять влажность почвы в другом месте участка смысла нет - она сильно отличается(начиная с того, что на уровне грунта выпадает роса, а в бочках нет). Плюс, у еспэхи один ADC, а мне важнее измерять им напряжение на аккумуляторе свей системы(можно конечно мультиплексор или внешний ADC использовать - но это усложнение всей системы и расход свободных лап) .
     
    ИгорьК нравится это.
  19. ИгорьК

    ИгорьК Гуру

    Сажаю в этом году огурцы в бочку! Подкупает тем, что не надо подвязывать - пусть свисают! Сколько у Вас таких бочек? Деревянные, пластиковые, металлические?
    Вообще, забабахать управление на одной ESP8266 - это круто. Но в описанной Вами ситуации важность определения влажности очень высока. Я бы приделал к ЕSPшке какую-нибудь Про мини. Стоит она смешно, а измеряет влажность и напряжение куда как эффективнее.
    Кстати, где-то читал, что ESP измеряет напряжение на лапе только от 0 до 1 вольта. Сам пока не проверял.
     
  20. Telek

    Telek Нерд

    Бочки металлические, 4 шт. В каждой по 6 плетей огурцов. Есть еще один плюс - огурцы нужно поливать теплой водой, т.е. из бочки. При схеме поливать из бочки в бочку, не нужны клапаны, т.е. не нужно отсекать поток воды после отключения насоса(уровень воды не выше уровня плива). Вот таким насосом я организую полив.
    ADC в ASP от 0-1 в, т.е. в любом случае его нужно использовать через делитель.
     
    ИгорьК нравится это.