Передать влажность с Arduino на другую Arduino посредством UART
- Войдите на сайт для отправки комментариев
Пнд, 28/04/2014 - 22:49
Здравтвсуйте Уважаемые!
Мне необходимо включать вытяжной вентилятор при определенной влажности. Вентилятор один, а помещений откуда буду брать показания влажности - два. Есть несколько штук китайских, дешевых Arduino Pro Mini.
К первой Про Мини подключен DHT11.
#include "DHT.h"
#define DHTPIN 2 // what pin we're connected to
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
}
void loop() {
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
float t = dht.readTemperature();
// check if returns are valid, if they are NaN (not a number) then something went wrong!
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C");
}
}
Я так понимаю, если здесь данные передаются в Serial, то их можно выловить другой Ардуино?
Не подскажете как?
Дак прямо и включайте одно SSR с двух дуин... Только диодами и резисторами их развяжите друг от друга...
Дак прямо и включайте одно SSR с двух дуин... Только диодами и резисторами их развяжите друг от друга...
Я прощу прощения, не сообщил что мало в этом разбираюсь. Я не понял что такое SSR?
Дак прямо и включайте одно SSR с двух дуин... Только диодами и резисторами их развяжите друг от друга...
Я прощу прощения, не сообщил что мало в этом разбираюсь. Я не понял что такое SSR?
Solis state relay
Ну у меня есть блок из 16 реле для ардуино. Там задуманно много чего. Хотелось бы именно вылавливать из UART и обрабатывать. Не нашел подобной информации в инете, потому спросил здесь.
А так спасибо. Не подумал о таком варианте.
Лучше вот тут почитать цикл статей...
http://easyelectronics.ru/upravlenie-moshhnoj-nagruzkoj-peremennogo-toka...
Лучше вот тут почитать цикл статей...
Дак у меня есть уже Relay Shield. Тиристоры это потом.
Если сделать так для передающего
#include "DHT.h" #define DHTPIN 2 // what pin we're connected to // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print(h); } }и для принимающего
int outputPin = 13; //Вместо реле пока диод int val; //здесь будет храниться принятый символ void setup() { Serial.begin(9600); //установка порта на скорость 9600 бит/сек pinMode(outputPin, OUTPUT); //устанавливаем 13 контакт в режим вывода } void loop() { if (Serial.available()) { //если есть принятый символ, val = Serial.read(); // то читаем его и сохраняем в val if (val >= 50) { // если влажность выше 50% digitalWrite(outputPin, HIGH);// то включаем светодиод } else { // иначе digitalWrite(outputPin, LOW); // то выключаем светодиод } } }Будет так работать?
Если хочется именно UART тогда нужно смотреть в сторону RS485 и, соответственно микросхемы (или модуля) MAX485
Спасибочки. Вы уже не первый который говорит про RS485. Значит буду пробовать Модбас. Микрухи куплю, буду здесь спрашивать что и как.
Модбас я так понимаю это протокол.
Если нужен обмен в одну сторону, то достаточно купить 2 шт (или больше) MAX485, вотнуть их в серийный порт, соединить проводами и работать как с серийником.
Вообще 485 отличается от обычного серийного только тем, что ему нужно указывать, в каком режиме работать - прием или передача
Модбас я так понимаю это протокол.
Наверное. Я не очень в этом понимаю. Но помню что Модбас как то связан с RS485.
А можно сделать проще!
Передавать данные через передатчик и приемник 433МГц. Там очень простой код передачи и если расстояния не очень большие то работает отлично.
Не нужно никакие провода тянуть и передатчик стоит около 90р
А можно сделать проще!
Передавать данные через передатчик и приемник 433МГц. Там очень простой код передачи и если расстояния не очень большие то работает отлично.
Не нужно никакие провода тянуть и передатчик стоит около 90р
Есть у меня такие передатчики. Еще не разбирался как с ними работать. Но у меня есть возможность бросить провода. Почему бы не сделать на проводах? А эфир оставить для будущих идей.
Ну я бы все таки не проводил провода
1)Нужно тратить время
2)Провода можно случайно перебить
3)С ними много мороки
Датчики стоят дешево и стабильно работают!)
В интернете много готовых программ!
P.S. Ну а так дело ваше)
А насколько надежна связь ? У Вас есть опыт ?
Я делал метеостанцию. Там ардуина измеряет температуру и передает на другую ардуино.
Все работает очень надежно, в пределах 2-х комнатной квартиры все отлично! На майских праздника буду пробывать на дальность.
Смотрите код, если что не понятно спрашивайте.
http://cxem.net/cms/drafts/4430/preview/
Странная логика. На мой взгляд, провода всегда лучше, если есть возможность их провести. Конечно, если не километр длиной. Впрочем ладно, это философский вопрос. Лично я бы не стал связываться с радио, если бы были провода.
Может быть вы и правы....но мне кажется провода это прошлый век)
Ну хорошо, радио. Сосед поставил тоже самое и досвидос радио. Вспомните вафлю,мне пришлось купить роутер на 5 ГГц, потому что на 2.4 всё засрано. Может провода и винтаж, но пока что.. Особенно если провода культурно лежат в кабель канале. Да ладно это всего лишь моё мнение, не парьтесь, опыт - сын ошибок трудных.. С проводами на мой взгляд проблемы в расстоянии, usart метров на 15 можно сделать, либо городить типа рс485. Сам не делал, потому - теоретически, плюс начитался этого всего.
Очень интересно, расскажите пожалуйста о результатах
Я делал метеостанцию. Там ардуина измеряет температуру и передает на другую ардуино.
Все работает очень надежно, в пределах 2-х комнатной квартиры все отлично! На майских праздника буду пробывать на дальность.
Смотрите код, если что не понятно спрашивайте.
http://cxem.net/cms/drafts/4430/preview/
Страница не найдена
http://cxem.net/cms/drafts/4430/preview/
Особенно если провода культурно лежат в кабель канале.
... и по этому кабель-каналу к Вам дружными рядами топают муравьи, тараканы и прочая мелкая нечисть...
Наглухо бетонированные в глубине стеновой плиты провода - это наше всё!
Дом дает усадку и наглуго бетонированные провода рвуться как нитки !
:-)
Это уже детали, как проложить. Я себе в новой хате не оставил под полом трубки для кабелей, теперь маюсь. Антенный провод верхом пробросил. Беда
А я положил, но, как выясняется, недостаточно: надо было двойной запас гофры сразу бетонировать. :)
Насчет усадки дома - это миф, если пойдет усадка поперек провода - никакие каналы (даже железная труба) не спасут.
http://cxem.net/cms/drafts/4430/preview/
Может я как то не так нажимаю. Но все равно Страница не найдена.
Мне можно сказать повезло. Отделки внутренней практически нет, потому ещё можно кабели тянуть.
Извиняюсь
Вот правильная сылка http://cxem.net/arduino/arduino115.php
Удачи, а то мне теперь сверлить 160мм бетона в неудобных местах. Перфоратор есть, но это слабое утешение. Эхх
Удачи, а то мне теперь сверлить 160мм бетона в неудобных местах. Перфоратор есть, но это слабое утешение. Эхх
Я вот все никак не пойму, в наше время есть множество способов передачи данных. Зачм тянуть провода там где это можно не делать?
Даже питание Ардуины можно делать "локальным" используя солнечные панели. И если питать только ардуино то все окупится быстро.
Я вот все никак не пойму, в наше время есть множество способов передачи данных.
Стереотипы батенька. Мы русские такие загадочные!!!
Я вот пугало хочу сделать от птиц. Там я думу думаю как солнечными элементами запитать. А в двух ванных мне проще провода бросить.
freearduino, попробуйте по воздуху подключить антенный провод и смотреть на другом конце кабельное телевидение и обычное аналоговое. Всё попкорн закончился
freearduino, попробуйте по воздуху подключить антенный провод и смотреть на другом конце кабельное телевидение и обычное аналоговое. Всё попкорн закончился
И зачем мне переавать такой большой обьем данных?
Ведь речь шла о передачи числовых данных, а ели нужно вещать видео то и тут есть передатчики которые позволяют передаввать видео на расстояния 1200м. Так-же можно взять Wi-Fi переатчики.
P.S. Я конечно не утвержда что везде можно применить беспрводную технологию....)
Вам не надо, а я в 24 сообщении говорил, что у меня проблема антенный кабель прокинуть, в этом контексте я и говорю
Мои микрухи MAX485 еще не пришли. Но у меня есть набор приемник/передатчик на 433 Мгц.
Попробовал передать влажность. Вроде получилось.
Передатчик
#include <VirtualWire.h> #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup(void) { //Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) dht.begin(); } void loop(void) { float h = dht.readHumidity(); int number = h; char symbol = 'H'; String strMsg = "z "; strMsg += symbol; strMsg += " "; strMsg += number; strMsg += " "; char msg[255]; strMsg.toCharArray(msg, 255); Serial.println(msg); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay(200); }Приемник
#include <VirtualWire.h> int led = 13; void setup() { Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Задаем скорость приема vw_rx_start(); // Начинаем мониторинг эфира pinMode (led, OUTPUT); } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера if (vw_get_message(buf, &buflen)) // Если принято сообщение { // Начинаем разбор int i; // Если сообщение адресовано не нам, выходим if (buf[0] != 'z') { return; } char command = buf[2]; // Команда находится на индексе 2 // Числовой параметр начинается с индекса 4 i = 4; int number = 0; // Посколько передача идет посимвольно, то нужно преобразовать набор символов в число while (buf[i] != ' ') { number *= 10; number += buf[i] - '0'; i++; } if (number > 40) { digitalWrite (led, HIGH); } if (number < 40) { digitalWrite (led, LOW); } Serial.print(command); Serial.print(" "); Serial.println(number); } }Вообщем нужно включать вытяжку при сильной влажности, и выключать при нормальной.
В последующем буду собирать данные и куда нибудь выводить.
Думаю как бы мне передачу организовать по реже. Эфир, так сказать, не забивать.
А как организовать прием данных с двух передатчиков?
передатчик передает формирует пакет данных вот в этом цикле:
Передается массив данных, первое значение массива это символ "z"
А приемник смотрит если первый символ зед то принимает, если нет то не принимает.
Т.е. Нужно в другом передатчики поставить вместо зед другой символ и когда будем принимать то по этому символу можно определить с какого передатчика пришли данные.
Спасибки. Попробую сегодня вечером.
Че то не могу разобратся.
Получаю влажность с двух датчиков. И не могу распределить чья где влажность.
Код первого передатчика.
#include <VirtualWire.h> #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup(void) { vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) dht.begin(); } void loop(void) { float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика int number = h; char symbol = '2'; String strMsg = "f "; strMsg += symbol; strMsg += " "; strMsg += number; strMsg += " "; char msg[255]; strMsg.toCharArray(msg, 255); Serial.println(msg); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay(2000); }Код второго
#include <VirtualWire.h> #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup(void) { vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) dht.begin(); } void loop(void) { float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика int number = h; char symbol = '1'; String strMsg = "s"; strMsg += symbol; strMsg += " "; strMsg += number; strMsg += " "; char msg[255]; strMsg.toCharArray(msg, 255); Serial.println(msg); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay(2000); }Код приемника
#include <VirtualWire.h> void setup() { Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Задаем скорость приема vw_rx_start(); // Начинаем мониторинг эфира } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера if (vw_get_message(buf, &buflen)) // Если принято сообщение { // Начинаем разбор int i; // Если сообщение адресовано не нам, выходим if (buf[0] != 'f' & 's') { return; } char command = buf[2]; // Команда находится на индексе 2 // Числовой параметр начинается с индекса 4 i = 4; int number = 0; // Посколько передача идет посимвольно, то нужно преобразовать набор символов в число while (buf[i] != ' ') { number *= 10; number += buf[i] - '0'; i++; } if (command = 2) { Serial.print("Second floor"); Serial.print(" "); Serial.println(number);} if (command = 1) { Serial.print("First floor"); Serial.print(" "); Serial.println(number);} }Сегодня купил несколько передатчиков и приемников
Вечером буду пробывать с нескольких передатчиков принимать сигнал.
Отпишусь.
Пробывал принимать данные с нескольких датчико.
Вот тут почитать можно: http://cxem.net/arduino/arduino119.php
Передавал с 2-х датчиков на 1 приемник, вполне неплохо получается.
Вот тут почитать можно: http://cxem.net/arduino/arduino119.php
Спасибочки! Почитаю обязательно.
Вот тут почитать можно: http://cxem.net/arduino/arduino119.php
Помогло.
Но теперь туплю и не могу зажечь светодиод если одна из влажности превысит например 42%
Передатчик 1
#include <VirtualWire.h> #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup(void) { vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) dht.begin(); } void loop(void) { float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика int number = h; char symbol = 'b'; String strMsg = "f "; strMsg += symbol; strMsg += " "; strMsg += number; strMsg += " "; char msg[255]; strMsg.toCharArray(msg, 255); Serial.println(msg); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay(2000); }Предатчик 2
#include <VirtualWire.h> #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup(void) { vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) dht.begin(); } void loop(void) { float h = dht.readHumidity();//переменной h присваиваем значение считанные с датчика int number = h; char symbol = 'a'; String strMsg = "s "; strMsg += symbol; strMsg += " "; strMsg += number; strMsg += " "; char msg[255]; strMsg.toCharArray(msg, 255); Serial.println(msg); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay(2000); }Приемник
#include <VirtualWire.h> int led = 13; int h1 = 0; int h2 = 0; void setup() { Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Задаем скорость приема vw_rx_start(); // Начинаем мониторинг эфира } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера if (vw_get_message(buf, &buflen)) { int i; int j; if (buf[0] == 's') { i = 4; int number = 0; while (buf[i] != ' ') { number *= 10; number += buf[i] - '0'; i++; } h2 = number; Serial.print("Second floor- "); Serial.println(number); } else { if (buf[0] == 'f') { j = 4; int number2 = 0; while (buf[j] != ' ') { number2 *= 10; number2 += buf[j] - '0'; j++; } h1 = number2; Serial.print("First floor- "); Serial.println(number2); } } } if ((h1 || h2) > 42) { digitalWrite (led, HIGH); } if ((h1 || h2) < 42) { digitalWrite (led, LOW); } }Так я и не победил это дело. Пришли мне готовые шилды RS485.
Пытаюсь сделать то что задумал посредством Модбас. Повторюсь необходимо получать данные о влажности с двух помещений, если влажность в любом из помещений поднялась выше (например) 70% то нужно включить вытяжку.
Есть три Ардуино про мини. Три http://www.ebay.com/itm/MAX485-module-RS-485-TTL-to-RS485-MAX485CSA-Converter-Module-For-Arduino-/170934217208?pt=LH_DefaultDomain_0&hash=item27cc7929f8 MODBUS шилда.
Два DHT11 датчитка.
Может уже делал кто то, что нибудь подобное?