Arduino Yún: Отправка температуры на Народный Мониторинг. Простой вариант.

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

  1. ИгорьК

    ИгорьК Гуру

    Занимаясь темой по управлению температурой, подумал, что не всем нужны возможности Линкус части Yun. И если ее не задействовать, плата неплохо подходит для проекта - код выходит небольшим, а проект - минимальной сложности.
    Yun - избыточно для этого? Ничуть. Если вы хотите отправлять данные с места, к которому нельзя бросить шнурок - Yun стоит дешевле, чем Uno + WiFi Shield.
    Таким образом, даже без Linux, Yun - вполне интересная плата.
    UPD. Указанное выше сохраняло актуальность до тех пор, пока не получила распространение плата ESP8266. Проект на ней выполняет абсолютно то же самое что и этот.

    Итак, просто шлем данные на Народный мониторинг.
    Используем любое количество датчиков DS18b20. Я использую три - на улице, в доме и в системе отопления. Вы - сколько хотите. Достаточно указать число в дефайнах.
    Соединения:
    Drawing7.png
     
    Последнее редактирование: 6 авг 2015
  2. ИгорьК

    ИгорьК Гуру

    Подключим Arduino Yun и заведем ее в сеть. Инструкция находится здесь.
    Кратко что там написано. Будучи включенной впервые, Yun создает свою собственную сетку wi-fi, с соответствующим названием, к которой нужно подключиться с компьютера, набрать адрес 192.168.240.1 в браузере и пароль [arduino].

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

    Поскольку Yun выключает свою сеть, компьютер автоматом вернется в домашнюю сеть.

    Дальше с Yun работаем как с обычной платой через USB шнурок. Грузим в нее код, предварительно исправив строку String myMac = "#XX-XX-XX-XX-XX-XX"; вместо X - цифры, да желательно чтобы получилось что-то уникальное.
    Вот код:
    Код (C):
    // Пояснения по DS18B20 http://goo.gl/T4G93K
    #include <Bridge.h>
    #include <YunClient.h>
    #include <OneWire.h>

    #define PIN_1WIRE 2                            // Сенсоры на ноге 2
    #define NUMBER_OF_SENSORS 3                    // Количество сенсоров

    OneWire ds(PIN_1WIRE);                          // Инициализируем 1Wire
    float temperature[NUMBER_OF_SENSORS];          // Массив данных температуры
    char server[] = "narodmon.ru";                  // Адрес отправки данных
    YunClient client;                              // Так положено
    String myMac = "#XX-XX-XX-XX-XX-XX";            // Заменить ХХ на ваши уникальные цифры;
    byte countSend = 0;                            // Считаем попытки установки связи с сервером

    void setup(void) {
        Bridge.begin();
    }

    void loop(void) {

        GetTemperature(temperature);                // Измерим и запишем в массив температуру.
        countSend = 0;                              // Обнуляем счетчик попыток отправки данных
        do {
            if (client.connect(server, 8283)) {    // Отправляем на Народный мониторинг
                client.println(myMac);              // Сначала Мак-адрес для определения свой/чужой
                                                    // Данные из ячеек отправляем на сервер
                for (byte ii = 0; ii < NUMBER_OF_SENSORS; ii++){
                    client.print("#Sensor");
                    client.print(ii);
                    client.print("#");
                    client.println(temperature[ii], DEC);
                }
                client.println("##");
                countSend = 5;                      // В случае удачи переполняем счетчик
            }
            else {
                countSend++;                        // Неудача - увеличиваем счетчик
                delay(1500);                        // Подождем (твою маму...)
            }

        }while (countSend < 5);                    // Не более 5 попыток отправки

        unsigned long tm = millis();                // Если что-то нам шлют в ответ - читаем
        while(millis() - tm < 5000) {              // но не более 5 секунд
            if (client.available()) {
                char c = client.read();
            }
        }
        client.stop();                              // Рарываем соединение
        delay(600000);                              // Ждем 10 минут как лохи (это я)
    }                                              // Если не лохи - можно поиграть с millis()
                                                    // Функция опроса датчиков принимает указатель на массив
    void GetTemperature (float * temperatureAddress) {
                                                    // Все стандартно из примера библиотеки 1 Wire
      byte i ;
      int tempCounter = 0;
      byte present = 0;
      byte data[9];                                // Только это не стандартно, в библиотеке зачем-то 12 в массиве
      byte addr[8];
      float celsius;

      while (1) {                                  // Если надо - по адресу http://goo.gl/T4G93K все пояснения кода
          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();
          }
          int16_t raw = (data[1] << 8) | data[0];
          celsius = (float)raw / 16.0;
          if (tempCounter < NUMBER_OF_SENSORS) {    // Заполняем массив данными
            *(temperatureAddress + tempCounter) = celsius;
          }
          tempCounter++;
      }
    }
     
    Это все. Дальше регистрируемся на сайте Народного мониторинга и наблюдаем за своими данными.

    UPD. Друзья! Я знаю, что некоторые повторяют эту схему, а некоторые боятся браться за нее. Кто повторил - отпишитесь в теме, и мне приятно и читающим спокойнее.
     
    Последнее редактирование: 29 апр 2015