Было написано множество статей на тему вариаций погодных станций на платформе Arduino. Вывод данных везде был различен. Позвольте представить мою вариацию, с выводом данных через Ethernet.
Итоговое фото сборки:Компоненты:* Arduino Uno r.3 — 1 шт.;
* Ethernet Shield W5100 — 1 шт.;
* Prototype Shield — 1 шт.;
* Датчик температуры и влажности DHT-22;
Датчики DHT-22 бывают в различных исполнениях, мне попался датчик уже готовый к подключению, с подтягивающим резистором:
* Датчик давления BMP085;
Данный датчик встречается в различных исполнениях, необходимо смотреть распиновку и наличие подтягивающих резисторов для подключения:
Итоговые компоненты схемы:Задачи:Основной задачей была реализация вывода данных о температуре, влажности и давлении в домашнюю сеть, так же в ходе разработки и прототипирования была реализована побочная задача управления нагрузкой через сеть.
Реализована возможность управления любой нагрузкой через WEB-интерфейс.
Образно алгоритм работы устройства выглядит так:* Задаем на Ethernet Shield MAC-адрес, ip-адрес и маску под сети;
* Задаем PIN для управления нагрузкой;
* Получаем данные с датчиков;
* Производим необходимые преобразования ( в данном случае имеется ввиду преобразование давления);
* Формируем WEB-страницу;
* Выводим значения с датчиков и состояние PIN нагрузки на страницу.
Далее привожу код, он содержит множество комментариев и думаю внесет ясность в то что делаем.
Код скетча:
// ========================Задаем необходимые библиотеки==========
#include
#include
#include
#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() =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(" ");
client.println(" ");
client.println(" :: Упр.Arduino:: V1.1");
client.println(" ");
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="’58242;" />LED-статус: ");
client.println("<font size="’58242;" />Вкл.");
}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="’58242;" />LED-статус: ");
client.println("<font size="’58242;" />Выкл");
}
//==============Вывод значений на web-страницу======================
client.println("<hr />");//линия=====================================
client.println("Tемпература = "); //Температура с DHT 22
client.println(t);
client.println(" *C");
client.println("
"); //перенос на след. строчку
client.println("Влажность = "); //Влажность с DHT 22
client.println(h);
client.println(" %\t");
client.println("
"); //перенос на след. строчку
client.println("<hr />");//линия=====================================
client.println("Давление = "); //давление с BMP 085
client.println(Pa);
client.println(" mm.рт.ст.");
client.println("
"); //перенос на след. строчку
client.println("<hr />"); //линия=====================================
client.println("Давление = "); //давление с BMP 085
client.println(Pa2);
client.println(" in Hg");
client.println("
"); //перенос на след. строчку
client.println("<hr />"); //линия=====================================
client.println("Tемпература внутреняя = ");//температура с BMP 085
client.println(tdpa);
client.println(" *C");
client.println("
"); //перенос на след. строчку
client.println("<hr />"); //линия=====================================
//==============================================================
client.println("");
//очищаем строку для следующего считывания
//==============Останавливаем web-client===========================
readString="";
client.stop();
//==============================================================
}
}
}
}
}
}
Web-интерфейс выглядит следующим образом:Интерфейс был сделан пока что только для получения данных и отладки, но в дальнейшем он будет модернизирован.
Вывод данных о давлении был целенаправленно сделан в двух значениях, таких как мм.рт.ст. и дюймы рт.ст..
По причине наличия, как эталонного датчика, часов с барометром в дюймах рт.столба.
Схема устройства:Стоимость устройства:- 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. Планируется получение данных со станции и построение графиков при помощи данной утилиты.
Ссылки по теме:Arduino на ХабреArduino&Oregon на ХабреКолдуем метеостанцию…Содержание данных передаваемых датчиком OregonОписание протокола OregonРазбор протокола Oregon