Ethernet метеостанция

Было написано множество статей на тему вариаций погодных станций на платформе Arduino. Вывод данных везде был различен. Позвольте представить мою вариацию, с выводом данных через Ethernet.

Итоговое фото сборки:



image

Компонетны:


  • Arduino Uno r.3


image

  • Ethernet Shield W5100


image

  • Prototype Shield


image

  • Датчик температуры и влажности DHT-22;


image

Датчики DHT-22 бывают в различных исполнениях, мне попался датчик уже готовый к подключению, с подтягивающим резистором:

image

  • Датчик давления BMP085


image
Данный датчик встречается в различных исполнениях, необходимо смотреть распиновку и наличие подтягивающих резисторов для подключения:

image

Итоговые компоненты схемы:


image

Задачи:


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

Образно алгоритм работы устройства выглядит так:


  • Задаем на Ethernet Shield MAC-адрес, ip-адрес и маску под сети;
  • Задаем PIN для управления нагрузкой;
  • Получаем данные с датчиков;
  • Производим необходимые преобразования ( в данном случае имеется ввиду преобразование давления);
  • Формируем WEB-страницу;
  • Выводим значения с датчиков и состояние PIN нагрузки на страницу.


Далее привожу код, он содержит множество комментариев и думаю внесет ясность в то что делаем.

Код скетча:


Код скетча:
// ========================Задаем необходимые библиотеки==========
#include <SPI.h>
#include <String.h>
#include <Ethernet.h>
#include "DHT.h"
#include "Wire.h"
#include "Adafruit_BMP085.h"
// ===============================================================
// ========================Задаем данные сети======================
byte mac[] = { 0xCA, 0xAF, 0x78, 0x1C, 0x13, 0x77 }; //mac - адрес ethernet shielda
byte ip[] = { 192, 168, 1, 33 };        // ip адрес ethernet shielda
byte subnet[] = { 255, 255, 255, 0 }; //маска подсети
EthernetServer server(80); //порт сервера
int ledPin = 4; // указываем что светодиод будет управляться через 4 Pin 
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //изначальный статус светодиода - выключен
// ===============================================================
#define DHTPIN 3    // пин для датчика DHT22
const unsigned char OSS = 0;  // Oversampling Setting
// ===============================================================
// ========================ТИП ДАТЧИКА DHT=======================
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
// ==============================================================
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
// ========================СТАРТУЕМ=============================
// ========================Управляем св.диодом на 4-м пине==========
void setup(){
  //запускаем Ethernet
  Ethernet.begin(mac, ip, subnet);
  //устанавливаем pin 4 на выход
  pinMode(ledPin, OUTPUT);
  //enable serial datada print
  Serial.begin(9600); 
      Serial.println("Port Test!"); // Тестовые строки для отображения в мониторе порта
      Serial.println("GO!");// Тестовые строки для отображения в мониторе порта
  dht.begin();
  bmp.begin(); 
}
// ==============================================================
void loop(){
  // ========================ДАТЧИКИ=============================
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float tdpa = bmp.readTemperature();
  float Pa0 = (bmp.readPressure());
  float Pa = (bmp.readPressure()/133.33);// переводим в мм.рт.ст.
  float Pa2 = (bmp.readPressure()/3386.582);// переводим в дм.рт.ст.
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
      Serial.print("H=: "); 
    Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temp.=: "); 
    Serial.print(t);
      Serial.println(" *C");
      Serial.print("Temp.dat.BMP = ");
    Serial.print(tdpa);
      Serial.println(" *C");
      Serial.print("Pressure = ");
    Serial.print(Pa);
      Serial.println(" mm.");    
      Serial.print("Pressure = ");
    Serial.print(Pa2);
      Serial.println(" in Hg");    
 // ==============================================================
   // =============Создаем клиентское соединение====================
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
    if (client.available()) {
      char c = client.read();
      //read char by char HTTP request
      if (readString.length() < 30) {
        //store characters to string
        readString.concat( c); }
        //output chars to serial port
        Serial.print( c);
        //if HTTP request has ended
        if (c == '\n') {
        //Проверяем включили ли светодиод?
        //Level=1 - включен
        //Level=0 - выключен
          if(readString.indexOf("Level=1") >=0) {
            //Включаем светодиод
            digitalWrite(ledPin, HIGH); // set the LED on
            LEDON = true;
          }else{
            //Выключаем светодиод
            digitalWrite(ledPin, LOW); // set the LED OFF
            LEDON = false; 
          }     
   // =============Формируем HTML-страницу==========================
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          client.println("<head> ");
          client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ");
          client.println("<title> :: Упр.Arduino:: V1.1</title>");
          client.println("</head> ");
          client.println("<body");
          client.println("<hr />");
          client.println("<h1> ::Упр.Arduino:: </h1>");
          if (LEDON){
            client.println("<form method=get name=LED><input type=radio name=Level value=1 CHECKED>Включить<input type=radio name=Level value=0>Выключить<input type=submit value=OK></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Вкл.");
          }else{
            client.println("<form method=get name=LED><input type=radio name=Level value=1>Включить<input type=radio name=Level value=0 CHECKED>Выключить<input type=submit value=OK></form>");
            client.println("<font size=’5′>LED-статус: ");
            client.println("<font size=’5′>Выкл");
          }
         //==============Вывод значений на web-страницу======================
              client.println("<hr />");//линия=====================================
            client.println("Tемпература = ");    //Температура с DHT 22
            client.println(t);
            client.println(" *C");
              client.println("<br> "); //перенос на след. строчку
            client.println("Влажность = ");    //Влажность с DHT 22
            client.println(h);
            client.println(" %\t");
              client.println("<br> "); //перенос на след. строчку
              client.println("<hr />");//линия=====================================
            client.println("Давление = ");    //давление с BMP 085
            client.println(Pa);
            client.println(" mm.рт.ст.");
               client.println("<br> "); //перенос на след. строчку
            client.println("<hr />");  //линия=====================================
            client.println("Давление = ");    //давление с BMP 085
            client.println(Pa2);
            client.println(" in Hg");
               client.println("<br> "); //перенос на след. строчку
               client.println("<hr />");  //линия=====================================
            client.println("Tемпература внутреняя = ");//температура с BMP 085
            client.println(tdpa);
            client.println(" *C");
               client.println("<br> "); //перенос на след. строчку
               client.println("<hr />");  //линия=====================================
            //==============================================================
            client.println("</body></html>");
            //очищаем строку для следующего считывания      
            //==============Останавливаем web-client===========================
            readString="";
            client.stop();
            //==============================================================
          }
        }
      }
     }
 }
 }



Web-интерфейс выглядит следующим образом:



image

Интерфейс был сделан пока что только для получения данных и отладки, но в дальнейшем он будет модернизирован.
Вывод данных о давлении был целенаправленно сделан в двух значениях, таких как мм.рт.ст. и дюймы рт.ст…
По причине наличия, как эталонного датчика, часов с барометром в дюймах рт.столба.

Схема устройства:


Схема устройства:
image


Стоимость устройства:


  • Arduino Compatible UNO Rev3 = USD$ 15.20
  • Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot for Arduino = USD$ 25.30
  • DHT22 2302 Digital Temperature Humidity Sensor = USD$ 10.90
  • BMP085 Barometric Pressure / Height Sensor Module for Arduino – Blue = USD$ 10.30
  • NT-R02BM 250~450MHz OOK/ASK Receiver Module (DC 5.0V) = USD$ 4.20

ИТОГО: USD$ 65.9

Предвижу сразу, что многие скажут что это дорого, но для меня роль играл сам факт реализации, а не цена.

Скетч и схема устройства:


LAN_Weather.rar

Дальнейшие планы:


  • В дальнейшем планируется доработка данной схемы RF-приемником и стандартным датчиком для измерения температуры и влажности Oregon THGN132N. Такие эксперименты уже описывались.
  • Так же в наличии имеется роутер типа ASUS RT-N16, на котором есть утилита RRDTool. Планируется получение данных со станции и построение графиков при помощи данной утилиты.

Фото на планы далее...
Приемник на 433 МГц, можно использовать любой совместимый.
image
Радиодатчик температуры и влажности Oregon THGN132N на 433 Мгц
image
Радиодатчик температуры и влажности Oregon THGN132N на 433 Мгц
image


Продолжение:


Ethernet погодная станция 2 – Продолжение…

Ссылки по теме:


Arduino на Хабре
Arduino&Oregon на Хабре
Колдуем метеостанцию…
Содержание данных передаваемых датчиком Oregon
Описание протокола Oregon
Разбор протокола Oregon
Поделиться публикацией
Комментарии 47
    +3
    Это для домашнего использования? Тогда почему «погодная»? Если для наружного применения — то как решаются вопросы питания, сети, низкой температуры, прямой освещенности и т.д.?
      0
      Ну так погоду ведь показывает барометр по изменению давления, а ему все равно где висеть. Единственное но — это температура только комнатная будет мониториться, но в планах ведь как раз внешний датчик на радиоканале :)
      0
      Да, да именно так, как сказал RubyFOX.
      Атмосферное давление одинаково и в помещении и на улице. А в данном исполнении будет мониториться комнатная температура и влажность. Хотя сама конструкция датчика давления позволяет так же выводить его температуру. Но в планах подключение приведенного на фото датчика Oregon. Однако, в минимальном варианте, можно и имеющийся датчик DHT-22 вынести на улицу.

      В качестве питания используется стандартный БП на 9В.
      Есть возможность работы от батареи типа «Крона», но сколько вся конструкция на ней продержиться пока не эксперементировал.
        0
        недолго — потребляет Arduino в таком режиме немало, десятки миллиампер.
        +1
        уже готовый к подключению, с подтягивающим резистором:

        боюсь на фотографии блокировочный конденсатор
          0
          Немного неудачное фото использовал.
          Подредактировал.
          Там и конденсатор и резистор.

          Вообще схема подключения самого датчика такова, например:
          image
            0
            Вы бы отвечали на комментарий, а не на свой пост. Тогда вопрошающий узрит ваш ответ.
              0
              Спасибо, учел.
            +10
            Бросайте вы это лего.
              +4
              Согласен, лего.
              Однако для решение определенных задач, и в отсутствии большого количества времени на проектирование плат и программированием МК, данное решение приемлемо.

              Но тут каждому свое. На вкус и цвет товарищей нет.
                +2
                В чём рисовали схему с ардуино?
                0
                Не надо бросать это лего. Интересно про Oregon THGN132N, хочу повторить на R-Pi.
                  0
                  Можно так же клиента разработать для установки на компьютер, который в трее будет показывать температуру, например. Кто захотел в городе — скачал и смотрит себе…
                  Еще к этому устройству не плохо бы еще одно, которое читало данные по wi-fi и выводило на свой дисплей. Устройство можно, например, повесить в коридоре.
                    0
                    По 1й части уже есть давно, на Хабре и в ВК обсуждалось.
                    0
                    Несколько напомнило статью на student-proger.ru. Только с бОльшим числом различных датчиков.
                    PS Про стоимость решения опять нислова…
                      0
                      Итоговая стоимость решения составляет USD$ 65.9, без учета стоимость внешнего датчика Oregon THGN132N и БП всей конструкции.
                        0
                        Oregon THGN132N около 800 руб. ± 150 руб.
                          0
                          Не особо-то дешево, учитывая, что это лишь датчик, причем только температуры и влажности, а давления нет.
                            0
                            Согласен, но в домашнем хозяйстве есть уже станция от Oregon. И датчик был с ней.
                            А так его можно найти по разным ценам. Мне удалось найти в указанном диапазоне, в своем городе.

                            Разборка показала наличие датчика влажности, обычной термопары, в качестве датчика температуры, и трех канальный передатчик на 433 МГц с двумя антеннами. Кому интересно могу выложить фото.
                              0
                              Конечно выкладывайте, любая дополнительная инфа не помешает.
                              PS По цене сравнивал внешний модуль Oregon с DHT22(~5$ темп+влажность) + приемо-передатчик на 433МГц(~2$) на ебее.
                                0
                                Для данного RF передатчика все же требуется 5 В питания, так же будет необходимость сделать схему управления передатчиком или шифратор/модулятор для кодирования данных с DHT-22.

                                Так то, оно на порядок дешевле, согласен.
                                  0
                                  Фото датчика привел ниже.
                        0
                        Зная точность китайских компонентов для Arduino я бы не сильно верил этим датчикам. У меня два ультразвуковых датчика показывают абсолютно разные цифры в одинаковых условиях, причем один из них дальше 3х метров не срабатывает, всегда передает расстояние 3 метра. То есть, оно годится только для «поиграться».
                          0
                          При чем здесь «компоненты для Arduino» прелесть в том, что можно подключить любой датчик к ардуино и считывать с него значения, если датчик врет, то ардуино тут ни при чем — купите датчик точнее и будет счастье. Но дело не в ардуино — на любой платформе вы можете взять датчик устраивающий по точности (вопрос бюджета).
                            0
                            Я вообще это написал к тому, что все топики типа «метеостанция с веб-интерфейсом за всего за n$» не учитывают как раз того, что для нормальной работы нужны компоненты совсем другого уровня. Это и печально, что из-за своей массовости arduino-компоненты такого хренового качества. Как выше заметили, это как лего сейчас. Arduino теперь это плата для того чтобы минимально заинтересовать и втянуть человека в эту сферу. Я вот уже наигрался экранчиком и ултразвуковыми датчиками которые глючат и боюсь заказывать что-то серьезнее за бОльшие деньги :)
                          0
                          Для экспериментов с Oregon THGN132N жду приемник на 433 МГц.
                          Увы, заказанный мною, приемник NT-R02BM 250~450MHz OOK/ASK Receiver Module, мне пока что не удалось применить, по причине отсутствия какого либо мануала и распиновки.

                          image
                          image
                            0
                            Поинтересовался. На ней стоит PT2272, вот даташит — а вот даже какой-то пример какой-то с arduino. Судя по всему, на площадках справа выставляется адрес (пайкой или можно поставить джамперы), а на пинах данные посылаются (или снимаются), можно проследить дорожки от микросхемы. Кстати, насколько я понимаю, это только приемник, а для передатчика надо брать что-то похожее, на на PT2262 (что работает с ним в паре).
                              0
                              Я встречал иную вариацию, с иной распиновкой.
                              За даташит спасибо. Попробую разобраться.
                              image
                              image

                              0
                              Но не знаю, хватит ли вам этого для температуры. 2 пина — питание и земля, еще один наверняка VT (valid transmission), остается всего 4 бита данных. Можно, конечно, что-нибудь придумывать…
                                0
                                По сути, там должны быть температура, влажность и состояние батареи.
                                Исходя из подобных проектов и работы с Oregon THGN132N.

                                Подробности работы с данными датчиками были описаны Arduino&Oregon на Хабре

                                Для меня, на данном этапе, сложнее определиться с RF-приемником и насколько он будет работоспособен с данным датчиком.
                                  0
                                  Так же есть еще такие данные о том, что посылает датчик.
                                  Содержание данных передаваемых датчиком Oregon
                                    0
                                    Вдохновила на подобный проект меня данная статья Колдуем метеостанцию…

                                    В частности, ее автор упоминает:
                                    Модуль АМ ASK приемника для частоты 433,92Мгц. Я использовал вот такой модуль — Telecontrolli RRQ3-433. В принципе он может быть любым, лишь бы напряжение питания было 5В и он был именно АМ.

                                    Telecontrolli RRQ3-433 мне не удалось найти для закупа.
                                      0
                                      Ну тогда вы совсем рядом. Я думаю, что проследив от самой микросхемы дорожки, вы легко найдете все эти Vcc/GND, VT (который поднимается после удачного приема) и оставшиеся четыре бита. Тем более, что и реализация протокола уже для Ардуино есть.

                                      (можно даже без ардуино — после того, как предположительно выставите адрес, останется только подать питание и слушать, появится ли что-то на VT и D0..D3 при включенном на тот же канал Орегоне)
                                        0
                                        Увы, я думаю, я ошибся с данным приемником. Ибо, последние изыскания, привели меня к выводам, что данный приемник работает в паре с таким же передатчиком и использует 8 битный код для сопряжения, задаваемый на самой плате перемычками. Хотя, может мое мнение и ошибочно.

                                        image
                                        image
                                        image
                                        image
                                          0
                                          В итоге, сейчас заказал иной приемник, буду ждать его прихода, для продолжение экспериментов с Oregon THGN132N.
                                0
                                На счет точности датчиков соглашусь. Хотя, для домашнего использования, не нужна высокая точность, по мне.
                                Достаточно приблизительных значений для того чтобы ориентироваться в погодных условиях.

                                Стоимость всего выше перечисленного, не указал, соглашусь промашка, постараюсь указать ближе к вечеру.
                                  +1
                                  Как и обещал.
                                  Дошли руки, снял, разобрал и пофоткал Oregon.

                                  image

                                  Сам датчик в разобранном состоянии. Питание одна батарея типа АА 1.5В.

                                  Плата боле детально.
                                  Видно переключатель каналов, 3-х диапазонный, и правее его кнопку RESET, представляющую из себя металлическую мембрану.
                                  Так же видна двойная антенна 433 МГц.

                                  image

                                  Фото самих датчиков более детально.
                                  Слева термодатчик, справа датчик влажности.
                                  Доступ среды к датчикам обеспечивается через три отверстия внизу корпуса.

                                  image

                                  Корпус не герметичен. Отсек батарей так же не герметичен. Поэтому, резонно размещаться защищено от попадания влаги и дождя.

                                    0
                                    Наконец то был получен необходимый радиомодуль.

                                    image

                                    Планирую продолжение эксперимента и дополнение станции внешним датчиком.

                                    Так же были получены исполнительные устройства в виде реле на нагрузку в 220В. Пока думаю что с ними сделать.
                                    image

                                    Вообще для удобства и простоты, а так же дальнейших экспериментов был приобретен GROVE — Base Shield V1.3
                                    image

                                    Продолжение эксперимента опишу в следующей статье.
                                      0
                                      Со скриптами отправки на narodmon.ru пока все также глухо?
                                      Люди время от времени интересуются…
                                      0
                                      Этот вопрос решу, как все будет собрано воедино и обьеденено в один корпус.
                                        0
                                        Планируете ли Вы написать продолжение статьи?
                                        0
                                        Да, планирую, времени нет к сожалению.
                                        На данном этапе устройство в корпусе:
                                        image

                                        Так же дополнено датчиком Oregon.
                                        И есть идея попробовать сделать автономное питание с солнечными батареями +акб.
                                        image

                                        PS
                                        Фото с мобилки, качество не очень и на скору руку.
                                          0
                                          А что делать, если датчик DHT-22 попался без нижней части и имеет 4 выхода?
                                            0
                                            Понял. Нужно подтягивающий резистор прицепить к одной из ножек, если кому интересно, ответ есть тут electronics-lab.ru/blog/mcu/46.html
                                              0
                                              По мне так DHT21(AM2301) лучше подходит для выносного крепления (не на плату), а протокол тот же что и у DHT22(AM2302).
                                                0
                                                А чем SHT10 плох?)
                                                I2C, диапазон 0–100%RH, -40..+125°С (точность ±4.5%RH, ±0.5°С), 8/12/14бит, 2.4-5.5В

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое