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 - лишнее нагромождение. Код позаимствую СПС
|
|
| |