Как то собирая свой блок управления печкой столкнулся с проблемой огромного количества проводов от датчиков температуры. К тому же у датчиков DS18B20 очень ограниченна длинна сигнального провода, при длине провода в 2м сигнал уже не доходил до контроллера. Перепайка резистора с 10КОм на 4К7 не сильно помогла. По этому решил обратиться за помощью к радио каналам, а в частности RF 433 MHz. Преимуществом этого радио модуля даже в том что стоят они сущие копейки. Заказывал на АлиЭкспресс
Погуглив нашел множество статей и готовых скетчей, но везде были простейшие приемы с передачей 1 параметра. А так как я сам еще начинающий ардуинщик и не знаю как передавать данные пакетом пришлось долго ковыряться в коде и вникать как что и куда. В итоге что то получилось немного переписал под себя и решил поделиться с вами. Думаю для начинающих вроде меня это пригодиться.
Итак начнем со схемы подключения. Тут думаю все очень просто
Переходим к программированию контроллеров (В моем случае это Arduino R3 Nano естественно китайская копия)
Начнем с передатчика:
Код // Тестировалось на Arduino IDE 1.8.1 #include <VirtualWire.h> // Библиотека RF 433 #include <OneWire.h> // Библиотека шины датчиков температуры #include <DallasTemperature.h> // Библиотека Датчиков #define ONE_WIRE_BUS 8 // Pin для подключения DS18B20 OneWire oneWire(ONE_WIRE_BUS); // Инициализирум шину DallasTemperature sensors(&oneWire); // Инициализируем датчики
void setup(void) { sensors.begin(); //Датчики vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) }
void loop(void) { sensors.requestTemperatures(); //читаем температуру int t1 =sensors.getTempCByIndex(0); // присваиваем переменной значение температуры int t2 =sensors.getTempCByIndex(1); // присваиваем переменной значение температуры String strMsg = "z "; //создаем стринговую переменнну с символом для идентификации приемником к которой прибавляем strMsg += " "; // Пробел для более удобной читаемости strMsg += t1; // переменная температуры 1 strMsg += " "; // пробел strMsg += t2; //переменная температуры 2 strMsg += " "; //пробел char msg[255]; //вот этот момент не понял strMsg.toCharArray(msg, 255); // начинаем процесс отправки Serial.println(msg); //зачем то отправляем в сериал vw_send((uint8_t *)msg, strlen(msg)); // процесс отправки vw_wait_tx(); // Ждем пока передача будет окончена delay(200); }
Скетч приемника Код // Тестировалось на Arduino IDE 1.8.1 #include <VirtualWire.h> // Бибилиотека для RF 433 Mhz
void setup() { Serial.begin(9600); // скорость сериал для общения с пк vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Задаем скорость приема vw_rx_start(); // Начинаем мониторинг эфира Serial.println("RF 433 MHz The radio module is activated"); }
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; // команда на начало скетча }
// далее нам надо выковырнуть наши данные с датчиков они начнутся с 3 символа для этого: i = 3; // переменную i приравняем к 3 int t1 = 0; // создаем переменную температуры 1 // Поскольку передача идет посимвольно, то нужно преобразовать набор символов в число while (buf[i] != ' ') { t1 *= 10; t1 += buf[i] - '0'; i++; } i = 6; //вторая температура начинается с 6-ого символа int t2 = 0; //создаем переменную второй температуры // Поскольку передача идет посимвольно, то нужно преобразовать набор символов в число while (buf[i] != ' ') { t2 *= 10; t2 += buf[i] - '0'; i++; } //печатаем в сериал наши переменные полученные в результает преобразования Serial.print("t1"); // текст Serial.print(" "); //пробел Serial.println(t1); //переменная первого датчика Serial.print("t2"); //текст Serial.print(" "); // пробел Serial.println(t2); //переменная второго датчика Serial.println("*********************"); //просто текст для разделения сообщений }
}
Постарался все как можно подробнее раскомментировать, что сам понял
В итоге
Библиотеки и готовые скетчи можно скачать вот отсюда Скачать с Облако Mail.Ru
|