Отправка данных показания датчика DHT11 из Arduino в ESP8266
- Войдите на сайт для отправки комментариев
Привет всем!
Подскажите пожалуйста пример.
К arduino mega подключён датчик влажности и температуры DHT11. Как отправить показания этого датчика в ESP8266 с дальнейшим отображением в WEB сервере ума не приложу.....
На ESP8266 при стандартной АТ прошивке работает. Но мне так не подходит. Т.к. веб страница с оверДОХРЕНА показаний датчиков, концевиков и кнопок много занимает места, и в мегу не вмещается.
Поэтому хочу использовать ресурсы ESP8266 и настраивать её в Arduino IDE.
Т.е. мега работает с датчиками, концевиками, и реле. Еспеха это всё отображает и отправляет команды меге например включить тёплый пол.
ESP8266 получилось настроить отправив команду для меги например: включить реле тёплого пола.
А вот передать показания датчика температуры из меги в есп у меня траблы.....
Вот как отправляете команду "включить реле теплого пола" точно так же отправляете обратно показания датчика.
в мегу не вмещается.
Ахренеть!
void serialEvent3() { while (Serial3.available()) { // Чтение данных из порта Serial3 char inChar = Serial3.read(); // Вывод прочитанных данных в порт Serial Serial.write(inChar); // Поиск команды в полученных данных (команда должна быть в квадратных скобках) inString += inChar; if (inChar == ']') { if (inString.indexOf("[ON]")>0) {digitalWrite(teplpol, HIGH); } else if (inString.indexOf("[OFF]")>0) {digitalWrite(teplpol, LOW);}Это в меге
webPage += "<p>Тёплый пол <a href=\"teplpolON\"><button>ON</button></a> <a href=\"teplpolOFF\"><button>OFF</button></a></p>"; // подключение к WiFi WiFi.begin(ssid, password); Serial.println(""); // ожидание соединения: while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.print("Connected to "); // "Подключились к " Serial.println(ssid); Serial.print("IP address: "); // "IP-адрес: " Serial.println(WiFi.localIP()); // Проверка запуска MDNS if (mdns.begin("esp8266", WiFi.localIP())) { Serial.println("MDNS responder started"); } server.on("/", [](){ server.send(200, "text/html", webPage); }); server.on("/teplpolON", [](){ server.send(200, "text/html", webPage); Serial.println("[ON]"); delay(1000); }); server.on("/teplpolOFF", [](){ server.send(200, "text/html", webPage); Serial.println("[OFF]"); delay(1000); });Это в ESP8266
Грёбаный рободин :((
Действительно, что выкинуть на помойку и использовать эзернет :(
и что тут в мегу не вмещается?
Насчет "выкинуть на помойку" - сдается мне, что "дело не в бобине" :)
Управление светом. Полив растений. Управление Тёплым полом. Управление увлажнителем. Управление жалюзи......... Дальше продолжать?
Я привёл пример как управлять реле. А мне нужно показания датчиков из меги в есп передать, и хз как.
Управление светом. Полив растений. Управление Тёплым полом. Управление увлажнителем. Управление жалюзи......... Дальше продолжать?
уверен, что написано это у вас неэффективно. В приведенном примере кода сразу вижу, что вы используете класс Стринг и константные строки в оперативке. Дальше продолжать? :)
Так что этот список - ни о чем. Может он и в Нану вошел бы, а может его просто надо разложить по пяти отдельным МК.
Serial3.write()
Вы меня не поняли.
Не хватает памяти у меги когда есп прошита в стандартную AT прошивку. Т.к. помимо обработки алгоритма работы ещё и HTML страница сжирают всю память меги, когда у есп отведено 8 мегабайт (хоть опой жуй), а на стандартной прошивке, есть подозрения, что память эта в простое, вот и пытаюсь её использовать.
И щас пытаюсь есп саму программировать в среде Arduino IDE. И не хватает знаний и понятий, как передать значение датчика температуры из Arduino mega в ESP8266.
а есп будет читать данные как Serial.available(). ???
Не понимаю. мега порт 3, есп порт только 1. Монитор порта с компьютера тоже порт 1.
Жесть какая-то...
У меги 4ре аппаратных сериала. Судя по вашим кускам кода сериал3 меги соединен с сериал есп. С меги шлете с сериала3 в есп принимаете на сериале.
а есп будет читать данные как Serial.available(). ???
Не понимаю. мега порт 3, есп порт только 1. Монитор порта с компьютера тоже порт 1.
Жесть какая-то...
В чём жесть-то? У Вашей ESP есть последовательный порт. Его можно подключить к компу, можно к меге. Но, разумеется, не одновременно.
Я правильно понимаю, что у Вас девайс - ардуино мега и esp "в одном флаконе"?
Совершенно верно.....
В общем, не выходит каменный цветок. Не обновляет свои переменные esp :(
в мегу не вмещается.
.......
Управление светом. Полив растений. Управление Тёплым полом. Управление увлажнителем. Управление жалюзи......... Дальше продолжать?
Давайте я продолжу ...
Не, ну если у Вас там не web страница, а целый порносайт, то тогда, конечно :)
Всё верно!
При добавлении очередной кнопки, веб сервер перестаёт отвечать.
Поэтому я наигрался с АТ командами. И хочу прошить в Arduino IDE эту бедную ESP8266
В общем, не выходит каменный цветок. Не обновляет свои переменные esp :(
Так а Вы для этого что-нибудь написали? Вот совсем свежая тема про обмен данными между двумя ардуинами: Проблема передачи по серийному порту между двумя ардуино Почитайте, вдруг поможет...
При добавлении очередной кнопки, веб сервер перестаёт отвечать.
Поэтому я наигрался с АТ командами. И хочу прошить в Arduino IDE эту бедную ESP8266
да с чего вы взяли. что вам это поможет? Если при добавлении очередной кнопки сервер перестает отвечать - надо долбить сервер, AT-прошивка-то чем виновата?
Понимаете, что я до вас пытаюсь донести? - нет? По тем вопросам. что вы задаете - видно что ваш уровень программирования не слишком высок. И коли это так - то надо разбираться с теми ошибками. что вы, очевидно, насажали в коде своей HTML-страницы - а не прыгать от одной прошивки к другой. Нет такой прошивки. на которой не нужно разбираться в алгоритмах и языках программирования. В вашем случае правильнее добить ту конфигурацию, в которой вы уже начали что-то создавать.
Ой я вас умоляю. Эту АТ прошивку юзаю от безысходности. Достаточно несколько раз нажать клавишу f5 и всё, веб сервер завис. Только перезагрузка её спасает. Я делаю вывод, что плата не исправна.
На Гиктаймсе про этот девайс статья была. Обзор и пример сервера. Посмотрите, может оттуда что подчерпнёте.
Достаточно несколько раз нажать клавишу f5 и всё, веб сервер завис. Только перезагрузка её спасает. Я делаю вывод, что плата не исправна.
С чего делается такой вывод? Почем не "код кривой"?
Да простейший веб сервер с включением светодиода. клавишу f5 f5 f5. И всё, веб сервер упал.... АТ прошивка видимо кривая. И ниче с ней не сделаешь.....
Поэтому пытаюсь перейти в среду arduino ide. Данных багов и зависаний тут не наблюдается, а тут грабли такие в виде труднопонятного кода общения по serial.
Учитывая, что нигде нет ни одного рабочего примера подключённых датчиков к меге уно или нано и выводом их на есп, видимо буду первопроходцем.
А если задать вопрос: "ребят, подключён датчик температуры ds18b20 к arduino mega. Как передать показания на esp8266 в веб сервер". Начинают кукарекать, зачем тебе мега, сделай всё на есп..... в общем как обычно, объясняют пол дня какой я идиот)
P.s. я не программист. Простите.
Я джва года этого ждал! Наконец-то кто-то разберется с этим чертовым веб-сервером на ESP!
И что труднопонятного в Serial.write и Serial.read? Serial3.write и Serial3.read? Ссылку на тему давали выше. Обыснаясвязь сеииал с сериал, ничего ноаого тут нет.
Я джва года этого ждал! Наконец-то кто-то разберется с этим чертовым веб-сервером на ESP!
Щас набигут разбиратели!
P.s. я не программист.
посмотрите библиотеку EasyTransfer вроде как облегчает делать обмен по сериал
Огромное спасибо ДРУЖИЩЕ!
зная эту информацию, создал в flprog и посмотрел на обмен. И ура!!!!
ESP8266 теперь работает полноценно, без китайской прошивки. С 8 мгб памтью на борту (хоть порно сайт на ней пиши).
УРААААААА грёбаный wemos побеждён!
Всем спасибо!!!!!!
Можно удалять свой профиль тут, чтоб не террорезировать народ.
Огромное спасибо ДРУЖИЩЕ!
зная эту информацию, создал в flprog и посмотрел на обмен. И ура!!!!
ESP8266 теперь работает
который раз поражаюсь, на какой ерунде можно встать в тупик...
Вс-таки я не педагог - я не в состоянии поставить себя на место новичка... хотя сам таким же был. наверно.
LoveDream - тем не менее учите программирование, на кривых костылях flprog далеко не уйти
Господа, ай нид ю хелп ) Сломал голову
У меня nrfnrf24l01 подключена к Меге (получает данные по каналу). Далее необходимо эти данные отправить с Меги на ESP8266 ESP-01, которая в свою очередь отправит данные на брокер (с брокером все ок, данные отправляются. в примерах скетча этой части не будет)
Не могу получить данные на ESP8266 по Serial. Перепробовал уже много вариантов. Ниже крайняя не рабочая версия...
Подскажите, что не так? Подправьте код плз :)
Мега (тут все вроде норм работает)
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include<SoftwareSerial.h> SoftwareSerial myData(10, 11); //RX, TX const uint64_t pipe = 0xF0F1F2F3F4LL; // Код трубы RF24 radio(9, 53); // Пины к которым подключены CE, CSN nRF24 void setup(){ Serial.begin(9600); // Скорость передачи данных аппаратного UART порта myData.begin(9600); radio.begin(); delay(1000); radio.setChannel(9); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу } void loop() { int data[2]={1,2}; if (radio.available()) // проверяем не пришло ли чего в буфер. { radio.read(data, 4); // читаем данные, указываем сколько байт читать Serial.print ("Humidity: "); Serial.print (data[0]); Serial.print ("%\t"); Serial.print ("Temperature: "); Serial.print(data[1]); Serial.println (" *C"); myData.write(reinterpret_cast<uint8_t *>(data), sizeof(data)); myData.readBytes(reinterpret_cast<uint8_t *>(data), sizeof(data)); for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) { Serial.print("data["); Serial.print(i); Serial.print("] = "); Serial.println(data[i]); } Serial.println(); delay(1000); } }ESP8266
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <stdlib.h> #include<SoftwareSerial.h> SoftwareSerial myData (5, 3); //RX, TX const char *ssid = "XXX"; // SSID Wi-Fi const char *pass = "XXX"; // Пароль Wi-Fi const char *mqtt_server = "192.168.1.1"; // IP адрус сервера mqtt const int mqtt_port = 1883; // Порт сервера mqtt const char *mqtt_user = "XXX"; // Имя пользователя сервера mqtt const char *mqtt_pass = "XXX"; // пароль пользователя сервера mqtt const char *mqtt_client_name = "XXX"; // Имя клиента сервера mqtt #define BUFFER_SIZE 100 unsigned long previousMillis = 0; const long interval = 10000; WiFiClient wclient; //Declares a WifiClient Object using ESP8266WiFi PubSubClient client(wclient, mqtt_server, mqtt_port); //instanciates client object //Function is called when, a message is recieved in the MQTT server. void setup() { // Setup console Serial.begin(9600); //set the baud rate myData.begin(9600); pinMode(5,INPUT); pinMode(3,OUTPUT); delay(10); Serial.println(); Serial.println(); } void loop() { if (WiFi.status() != WL_CONNECTED) { //wifi not connected? Serial.print("Connecting to "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); if (WiFi.waitForConnectResult() != WL_CONNECTED) return; Serial.println("WiFi connected"); } if (WiFi.status() == WL_CONNECTED) { //client object makes connection to server if (!client.connected()) { Serial.println("Connecting to MQTT server"); //Authenticating the client object if (client.connect(MQTT::Connect("mqtt_client_name") .set_auth(mqtt_user, mqtt_pass))) { Serial.println("Connected to MQTT server"); //Subscribe code client.subscribe("Temparture-sensor"); } else { Serial.println("Could not connect to MQTT server"); } } if (client.connected()) client.loop(); } SendTempHumid(); // this will send the dummy temparature reading } // Non-Blocking delay void SendTempHumid() { int data[2] = {1,2}; // if (myData.available () >=sizeof(data)) { myData.readBytes(reinterpret_cast<uint8_t *>(data), sizeof(data)); for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) { Serial.print("data["); Serial.print(i); Serial.print("] = "); Serial.println(data[i]); } Serial.println(); delay(1000); } }В мониторе порта ESP полученных NRF данных не вижу :(
На ESP RX TX пробовал и 2, 7 и 3, 5 безрезультатно. Подключение через конвектор логических уровней или делитель на резисторах не помогла, значит что-то с кодом не то :(
вы читаете из Сериал. даже не проверяя. есть ли там что-то. Ну и вообще в коде напихано куча лишнего.
Лишнее уберу. По поводу проверки.
Проверку на ESP пока убрал, что бы монитор показывал все, что есть... Потом добавлю.
У Мега в сериале есть данные. Они выводятся, тут все ок. Или я в чем-то не прав? :)
Не получается отправить их на ESP (или считать их).
Может поможете кусочком кода для ESP? :)
Может поможете кусочком кода для ESP? :)
нет никакого специального "кода для ЕСП", сериал что на Меге, что на ЕСП работает одинаково. Могу вам выложить свою библиотеку для передачи двоичных данных по Сериал. надо?
Да, буду благодарен!
Хорошо, ближе к вечеру
два файла, пложить в директорию скетча
UARTTransfer.h
#pragma once //Not necessary, but just in case. #if ARDUINO > 22 #include "Arduino.h" #else #include "WProgram.h" #endif #include "Stream.h" #define UT_BUFFER_SIZE 32 #define UT_MIN_MESS_SIZE 3 #define UT_HEADER1 0xb7 #define UT_HEADER2 0x07 #define UT_HEADER3 0x33 class UARTTransfer { public: UARTTransfer(); ~UARTTransfer(); void begin(Stream *theStream); void sendData(uint8_t send_id, uint8_t size, uint8_t* data); bool receiveData(); uint8_t getMessageID() { return mess_id;}; uint8_t getDataLength() { return mess_data_size; }; uint8_t getData(uint8_t* dest, uint8_t size); void clearMessage(); Stream *_stream; private: uint8_t rx_buf[UT_BUFFER_SIZE]; uint8_t buf_ind = 0; uint16_t rx_time; uint16_t rx_timeout = 500; uint8_t rx_stage =0; uint8_t head[3] = { UT_HEADER1 , UT_HEADER2, UT_HEADER3 }; uint8_t mess_id, mess_data_size; };UARTTransfer.cpp
#include "UARTTransfer.h" UARTTransfer::UARTTransfer() { } UARTTransfer::~UARTTransfer() { } void UARTTransfer::begin(Stream *theStream) { _stream = theStream; } boolean UARTTransfer::receiveData() { uint8_t mess_len = 0; uint8_t in_char; if (rx_stage > 5) return false; if ((rx_stage) && ((millis() - rx_time) > rx_timeout)) { clearMessage(); } if (!(_stream->available())) return false; else mess_len = _stream->available(); while (mess_len) { in_char = _stream->read(); mess_len--; if (rx_stage == 0) { while ((in_char != head[rx_stage]) && (mess_len)) { in_char = _stream->read(); mess_len--; } if (in_char != head[rx_stage]) return false; rx_stage++; rx_time = millis(); } else if (rx_stage < 3) { if (in_char != head[rx_stage]) { clearMessage(); } else rx_stage++; } else { if (rx_stage == 3) { mess_id = in_char; rx_stage++; } else if (rx_stage == 4) { mess_data_size = in_char; if (mess_data_size < UT_MIN_MESS_SIZE) { clearMessage(); } else rx_stage++; } else if (rx_stage == 5) { rx_buf[buf_ind++] = in_char; if (buf_ind == mess_data_size) { mess_data_size--; uint8_t calc_CS = mess_data_size; for (uint8_t i = 0; i < mess_data_size; i++) { calc_CS ^= rx_buf[i]; } if (calc_CS == rx_buf[mess_data_size]) { //CS good rx_stage++; return true; } clearMessage(); } } } } return false; } void UARTTransfer::sendData(uint8_t send_id, uint8_t size, uint8_t* data) { uint8_t CS = size; for (uint8_t i = 0; i < 3; i++) { _stream->write(head[i]); } _stream->write(send_id); _stream->write(size + 1); for (uint8_t i = 0; i < size; i++) { CS ^= *(data + i); _stream->write(*(data + i)); } _stream->write(CS); } uint8_t UARTTransfer::getData(uint8_t* dest, uint8_t size) { memcpy(dest, rx_buf, size); return size; } void UARTTransfer::clearMessage() { rx_stage = 0; mess_id = 0; mess_data_size = 0; buf_ind = 0; }Пример использования
#include "UARTTransfer.h" UARTTransfer UT; // идентификатор канала, 1 байт, должен быть одинаков на приемнике и передатчике #define UT_CHANNEL 0x45 void setup(void) { Serial.begin(9600); UT.begin(&Serial); } void loop() { uint16_t data[2]; // получение данных if (UT.receiveData()) { uint8_t m_id = UT.getMessageID(); if ((m_id == UT_CHANNEL) && (UT.getDataLength() == sizeof(data) )) { UT.getData((uint8_t*)data, sizeof(data)); } UT.clearMessage(); } // отправка UT.sendData(UT_CHANNEL, sizeof(data), (uint8_t*) data); delay(1000); }пример наваял прямо сходу, проверить не на чем, извиняйте за возможные опечатки
b707 Спасибо тебе огромное!
b707 Спасибо тебе огромное!
так работает или нет?
Пробую...
Мега залилась, затык в ESP
Сейчас ESP ругается на boolean в файле UARTTransfer.cpp
---
UARTTransfer.cpp:11:10: error: prototype for 'boolean UARTTransfer::receiveData()' does not match any in class 'UARTTransfer'
boolean UARTTransfer::receiveData() {
^
In file included from sketch\UARTTransfer.cpp:1:0:
UARTTransfer.h:21:10: error: candidate is: bool UARTTransfer::receiveData()
bool receiveData();
---
Если заменить на bool UARTTransfer::receiveData() то заливает, но результат ноль
Проверил на связке двух ардуин (отправка с Меги на Нано) все работает. Продолжаем мучать ESP )) Пороюсь в закромах, может другую серию ESP найду
Проверил на связке двух ардуин (отправка с Меги на Нано) все работает. Продолжаем мучать ESP )) Пороюсь в закромах, может другую серию ESP найду
У меня этот код работает именно на ЕСП. Ошибки с bool - boolean нет
И еще имейте в виду, что одни и те же модели ЕСП бывают с разным кварцем, например ЕСП-01 бывает с кварцем на 26 и на 40 МГц. Если в настройках поставить неправильную частоту - практически все будет работать, кроме Сериал. Проверьте, просто в Монитор порта ваша Есп что-нибудь выводит?
Сама ESP работает, но вот с получением по сериал что-то глухо..... Сейчас 40МГц, 26 нет в меню... ХЗ... И как на зло осталось только две ESP-01...
Сама ESP работает, но вот с получением по сериал что-то глухо..... Сейчас 40МГц, 26 нет в меню...
В чем выражается. что "сама ЕСП работает" ? Если просто подключить ЕСП к USB и вывести в сериал что-то типа "Hello world" - в Мониторе порта это видно?
И то. что в меню нет 26 Мгц - это очень странно, должно быть.
по поводу кварца
На этой картинке кварц - небольшой серый прямоугольник под словом "Cloud". В лупу на нем можно прочитать цифры 26 или 40. Посмотрите на своей плате - если там 26, а в настройках 40 - сериал работать не будет
"Если просто подключить ЕСП к USB и вывести в сериал что-то типа "Hello world" - в Мониторе порта это видно?"
Да, работает.
"Посмотрите на своей плате - если там 26, а в настройках 40 - сериал работать не будет"
Таки 26
"И то. что в меню нет 26 Мгц - это очень странно, должно быть.
Спасибо! Обновил библиотеку появилось 26... Но пока не помогло )))) Отрыл таки ESP-07 результат тот же.
Я явно что-то делаю не так ... Надо сделать перерыв на сегодня...
b707 пока безрезультатно... и частоту менял ... и так... и эдак... Видимо где-то что-то я не то делаю, но не могу понять.
Вопрос (что не так с ESP в ниже приведенном варианте?)!
Мега (данные получаю и они уходят через 11 пин, тут все гуд)
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include<SoftwareSerial.h> SoftwareSerial myData(10, 11); //RX, TX const uint64_t pipe = 0xF0F1F2F3F4LL; // Код трубы RF24 radio(9, 53); // Пины к которым подключены CE, CSN nRF24 void setup(){ Serial.begin(9600); // Скорость передачи данных аппаратного UART порта myData.begin(9600); radio.begin(); delay(1000); radio.setChannel(9); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу } void loop() { int data[2]={1,2}; if (radio.available()) // проверяем не пришло ли чего в буфер. { radio.read(data, 4); // читаем данные, указываем сколько байт читать myData.write(reinterpret_cast<uint8_t *>(data), sizeof(data)); myData.readBytes(reinterpret_cast<uint8_t *>(data), sizeof(data)); for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) { Serial.print("data["); Serial.print(i); Serial.print("] = "); Serial.println(data[i]); } Serial.println(); delay(1000); } }Нано
#include <PubSubClient.h> #include <stdlib.h> #include<SoftwareSerial.h> SoftwareSerial myData (9, 10); //RX, TX void setup() { // Setup console Serial.begin(9600); myData.begin(9600); delay(10); Serial.println(); } void loop() { int data[2] = {1,2}; { myData.readBytes(reinterpret_cast<uint8_t *>(data), sizeof(data)); for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) { Serial.print("data["); Serial.print(i); Serial.print("] = "); Serial.println(data[i]); } Serial.println(); delay(1000); } }Все работает и на Нано (Pin 9) данные получены.
А вот если то же засунуть в ESP
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include<SoftwareSerial.h> #include <stdlib.h> SoftwareSerial myData(3, 5); //RX, TX void setup() { Serial.begin(9600); myData.begin(9600); delay(10); Serial.println(); } void loop() { int data[2]={1,2}; myData.readBytes(reinterpret_cast<uint8_t *>(data), sizeof(data)); for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) { Serial.print("data["); Serial.print(i); Serial.print("] = "); Serial.println(data[i]); } Serial.println(); delay(1000); }данных нет :(
RX,TX местами не перепутали?
Нет, не перепутал. Для чистоты эксперимента менял местами. И пины менял.
Либо библа не рабочая, либо с пинами, что-то не то.