[ Войти · Правила форума · Поиск · RSS ]

  • Страница 1 из 1
  • 1
Ethernet погодная станция
AnymousДата: Пятница, 10.01.2014, 19:00 | Сообщение # 1
.::Создатель::.
Сообщений: 863
Репутация: 53 ±
Награды: 24 +
Было написано множество статей на тему вариаций погодных станций на платформе 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 <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("
"); //перенос на след. строчку
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("</body>");
//очищаем строку для следующего считывания
//==============Останавливаем 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. Планируется получение данных со станции и построение графиков при помощи данной утилиты.




Как создать скриншот? | Как создать лог файл HijackThis?
Причины, по которым может тормозить компьютер | Правила сайта!
 
ThermaltakeДата: Четверг, 23.01.2014, 01:16 | Сообщение # 2
Сообщений: 5
Репутация: 0 ±
А зачем Prototype Shield - лишнее нагромождение.
Код позаимствую СПС
 
  • Страница 1 из 1
  • 1
Поиск:


Чтобы добавить сообщение или создать новую тему, необходимо зарегистрироваться или зайти под своим ником!
вверх
Файлы для обмена предоставлены пользователями сайта. Администрация не несёт ответственности за их содержание. На сервере хранятся только торрент-файлы. Это значит, что мы не храним никаких нелегальных материалов, а так же материалов охраняемых авторским правом.
RudSOFT © 2010 - 2024 | Карта сайта | Карта форума | Хостинг от uCoz Cвязь с Администрацией | Информация для правообладателей