Как стать автором
Обновить

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

Время на прочтение6 мин
Количество просмотров148K
Было написано множество статей на тему вариаций погодных станций на платформе 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
Теги:
Хабы:
Всего голосов 71: ↑49 и ↓22+27
Комментарии47

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн