Использовать NodeMCU 12E (ESP8266) в качестве экрана Wi-Fi для Arduino Nano
Обновление: Пункт 1. Я не хочу программировать ESP, я просто хочу использовать его как шилд Wi-Fi. потому что я не знаком с перепрошивкой или написанием скетчей для ESP, поэтому все равно чувствую себя комфортно с Arduino. Помимо моих существующих проектов необходимо обновить версию Wi-Fi. Невозможно превратить все в esp вместо arduino. Пункт 2. Если кто-нибудь может предоставить мне полный рабочий скетч, в котором Arduino отправляет значение в ESP, ESP получает его, а затем отправляет на какой-либо сервер данных (подойдет даже тип SparkFun).
Последние пару месяцев я работал над проектом на базе Arduino, где мне приходилось считывать несколько данных датчиков (например, температуру, влажность, свет, звук, движение и т. д.) и сохранять эти данные на удаленном сервере MySQL. У меня все хорошо с Arduino Uno и Ethernet Shield, к которому я подключаюсь через кабель RJ45, чтобы мой Arduino UNO мог использовать Интернет. вот код для этого:
#include <SPI.h>
#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(1.1.10.); // IP *сервера* MySQL здесь
char user[] = "root"; // Имя пользователя для входа в MySQL
char password[] = "007"; // Пароль для входа пользователя MySQL
// Пример запроса
char INSERT_DATA[] = "INSERT INTO database (message, sensor_num, value) VALUES ('%s',%d,%s)";
char query[128];
//температура угля[10];
int potPin = 4;
float temperature = 0;
long val=0;
EthernetClient client;
MySQL_Connection conn((Client *)&client);
void setup() {
Serial.begin(115200);
while (!Serial); // ждем подключения последовательного порта
Ethernet.begin(mac_addr);
Serial.println("Connecting...");
if (conn.connect(server_addr, 3306, user, password)) {
delay(200);
// Инициируем экземпляр класса запроса
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
// Сохранять
//dtostrf(50.125, 1, 1, температура);
sprintf(query, INSERT_DATA, "test sensor", 24, temperature);
// Выполняем запрос
cur_mem->execute(query);
// Примечание: поскольку результатов нет, нам не нужно считывать какие-либо данные
// Удаление курсора также освобождает используемую память
delete cur_mem;
Serial.println("Data recorded.");
}
else
Serial.println("Connection failed.");
conn.close();
}
void loop() {
val = analogRead(potPin);
temperature = (val*0.0048828125*1000);
delay(2000);
}
Позже я обнаружил, что использовать кучу кабелей неудобно, поэтому я подумал о том, чтобы сделать его беспроводным. Сначала я думал о RF24OL, но он также не может напрямую подключаться к Интернету. Затем я нашел модуль ESP8266, который может напрямую подключаться к Wi-Fi. Теперь я купил ESP8266 12e (не ESP-01), у которого был один USB-порт для подключения к компьютеру, что значительно упростило работу по сравнению с предыдущими версиями ESP. Я также установил файлы поддержки ESP в свою среду разработки Arduino, протестировал, и все работает нормально. Но проблема в том, что всякий раз, когда я загружаю код только для ESP (например, подключение к Wi-Fi), он компилируется и загружается правильно.
Как работает этот код:
void setup() {
pinMode(BUILTIN_LED, OUTPUT);
}
void loop() {
digitalWrite(BUILTIN_LED, LOW);
delay(500);
digitalWrite(BUILTIN_LED,HIGH);
delay(300);
}
это тоже нормально работает
/*
* Этот скетч пытается подключиться к лучшей точке доступа на основе заданного списка.
*
*/
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
void setup() {
Serial.begin(115200);
delay(10);
wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");
Serial.println("Connecting Wifi...");
if(wifiMulti.run() == WL_CONNECTED) {
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
}
void loop() {
if(wifiMulti.run() != WL_CONNECTED) {
Serial.println("WiFi not connected!");
delay(1000);
}
}
Это означает, что с моей Arduino IDE, ESP8266 12e, проблем не возникло. Но всякий раз, когда я добавляю что-то еще, например библиотеку DHT11, компиляция показывает ошибку.
этот код не компилируется:
#define SSID "Itead_1(Public)" //введите собственное имя SSID
#define PASSWORD "27955416" //введите свой собственный пароль WIFI
#include "uartWIFI.h"
#include <SoftwareSerial.h>
WIFI wifi;
extern int chlID; //идентификатор клиента(0-4)
// для API Yeelink
#define APIKEY "3a362e99d6f1daf974561163a8c99a85" // замените здесь ключ API yeelink
//заменяем идентификатор устройства и идентификатор датчика на датчик температуры.
#define DEVICEID0 15483 // замените идентификатор вашего устройства
#define SENSORID0 26660 // замените идентификатор вашего датчика
//заменяем идентификатор устройства и идентификатор датчика на датчик влажности.
#define DEVICEID1 15483 // замените идентификатор вашего устройства
#define SENSORID1 26661 // замените идентификатор вашего датчика
char server[] = "api.yeelink.net"; // адрес имени для API yeelink
unsigned long lastConnectionTime = 0; // время последнего подключения к серверу в миллисекундах
boolean lastConnected = false; // состояние соединения в последний раз через основной цикл
const unsigned long postingInterval = 5*1000; // задержка между двумя точками данных, 5 с
String returnValue = "";
boolean ResponseBegin = false;
int DHT11PIN=25; //Подключаем D25 к контакту данных DHT11
int humidity;
int temperature;
int post_number;
void setup()
{
wifi.begin();
bool b = wifi.Initialize(STA, SSID, PASSWORD);
if(!b)
{
DebugSerial.println("Init error");
}
delay(8000); //убедимся, что у модуля достаточно времени для получения IP-адреса
String ipstring = wifi.showIP();
DebugSerial.println(ipstring); //показываем IP-адрес модуля
}
void loop()
{
char message[400];
// если вы не подключены и с тех пор прошло десять секунд
// ваше последнее соединение, затем подключаемся снова и отправляем данные:
if((millis() - lastConnectionTime > postingInterval)) {
//читаем dht11
int chk = dht11_read(DHT11PIN);
if(chk==0)
{
if(post_number==0)
{
sendData(DEVICEID0,SENSORID0,temperature);
post_number++;
}
else
{
post_number = 0;
sendData(DEVICEID1,SENSORID1,humidity);
}
}
}
// если есть входящие данные из сетевого соединения.
// отправляем его через последовательный порт. Это для отладки
// только цели:
if(wifi.ReceiveMessage(message))
{
DebugSerial.println(message);
}
delay(10);
}
// этот метод устанавливает HTTP-соединение с сервером:
void sendData(int device_id,int sensor_id,int thisData) {
// если есть успешное соединение:
if (wifi.ipConfig(TCP,server, 80)) {
DebugSerial.println("connecting...");
// отправляем HTTP-запрос PUT:
String cmd;
cmd = "POST /v1.0/device/";
cmd += String(device_id);
cmd += "/sensor/";
cmd += String(sensor_id);
cmd += "/datapoints";
cmd += " HTTP/1.1\r\n";
cmd += "Host: api.yeelink.net\r\n";
cmd += "Accept: *";
cmd += "/";
cmd += "*\r\n";
cmd += "U-ApiKey: ";
cmd += APIKEY;
cmd += "\r\n";
cmd += "Content-Length: ";
int thisLength = 10 + getLength(thisData);
cmd += String(thisLength);
cmd += "\r\n";
cmd += "Content-Type: application/x-www-form-urlencoded\r\n";
cmd += "Connection: close\r\n";
cmd += "\r\n";
cmd += "{"value":";
cmd += String(thisData);
cmd += "}\r\n";
DebugSerial.println(cmd);
wifi.Send(cmd);
// отмечаем время установления соединения:
lastConnectionTime = millis();
}
else {
// если не удалось установить соединение:
DebugSerial.println("connection failed");
DebugSerial.println("disconnecting.");
wifi.closeMux();
}
}
int getLength(int someValue) {
// есть хотя бы один байт:
int digits = 1;
// непрерывно делить значение на десять,
//добавляем единицу к количеству цифр для каждой
// время, в течение которого вы делите, пока не достигнете 0:
int dividend = someValue /10;
while (dividend > 0) {
dividend = dividend /10;
digits++;
}
// возвращаем количество цифр:
return digits;
}
int dht11_read(int pin)
{
// БУФЕР ДЛЯ ПРИЕМА
int bits[5];
int cnt = 7;
int idx = 0;
// ПУСТОЙ БУФЕР
for (int i=0; i< 5; i++)
{bits[i]= 0;}[/i]
[i] // ЗАПРОСИТЬ ОБРАЗЕЦ[/i]
[i] pinMode(pin, OUTPUT);[/i]
[i] digitalWrite(pin, LOW);[/i]
[i] delay(18);[/i]
[i] digitalWrite(pin, HIGH);[/i]
[i] delayMicroseconds(40);[/i]
[i] pinMode(pin, INPUT);[/i]
[i] // ПОДТВЕРЖДЕНИЕ или ТАЙМ-АУТ[/i]
[i] unsigned int loopCnt = 10000;[/i]
[i] while(digitalRead(pin) == LOW)[/i]
[i] if (loopCnt-- == 0) return -2;[/i]
[i] loopCnt = 10000;[/i]
[i] while(digitalRead(pin) == HIGH)[/i]
[i] if (loopCnt-- == 0) return -2;[/i]
[i] // ЧТЕНИЕ ВЫВОДА - 40 БИТ => 5 БАЙТОВ или ТАЙМ-АУТ[/i]
[i] for (int i=0; i<40; i++)[/i]
[i] {[/i]
[i] loopCnt = 10000;[/i]
[i] while(digitalRead(pin) == LOW)[/i]
[i] if (loopCnt-- == 0) return -2;[/i]
[i] unsigned long t = micros();[/i]
[i] loopCnt = 10000;[/i]
[i] while(digitalRead(pin) == HIGH)[/i]
[i] if (loopCnt-- == 0) return -2;[/i]
[i] if ((micros() - t) > 40) bits[idx] |= (1 << cnt);[/i]
[i] if (cnt == 0) // следующий байт?[/i]
[i] {[/i]
[i] cnt = 7; // перезапуск со старшего байта[/i]
[i] idx++; // следующий байт![/i]
[i] }[/i]
[i] else cnt--;[/i]
[i] }[/i]
[i] // ЗАПИСАТЬ В ПРАВЫЕ ПАРНЫЕ[/i]
[i] // поскольку биты[1] и биты[3] всегда равны нулю, они опускаются в формулах.[/i]
[i] humidity = bits[0]; [/i]
[i] temperature = bits[2]; [/i]
[i] int sum = bits[0] + bits[2]; [/i]
[i] if (bits[4] != sum) return -1;[/i]
[i] return 0;[/i]
Итак, я решил использовать ESP и Arduino Nano вместе. Таким образом, ESP будет работать как Wi-Fi, защищенный для подключения к Интернету, как раньше делал Ethernet Shield , Arduino будет обрабатывать части чтения данных датчиков и так далее. Я пытался подключиться к Интернету, подключив RX-TX и TX-RX между Arduino-ESP, но это не сработало. Я загрузил сценарий подключения Wi-Fi в ESP, и он правильно подключается к Wi-Fi, затем я загрузил чтение и сохранение данных датчика в сценарий MySQL на arduino, затем подключил arduino tx & от rx до esp rx & tx. но ардуино не может подключиться к интернету. Теперь моя проблема в том, как я могу использовать ESP8266 12e NodeMCU только в качестве экрана Ethernet, чтобы мой Arduino мог подключаться к Интернету и загружать данные на мой сервер sql? Мой ESP будет действовать только как экран Wi-Fi, я не хочу настраивать ESP для чтения данных датчиков, потому что у него нет контактов GPIO, и, что наиболее важно, он работает не так гладко, как Arduino. Поэтому, пожалуйста, не предлагайте мне использовать только ESP с датчиками, потому что я также хотел обновить свои существующие проекты до Wi-Fi, что было сделано с помощью Ethernet-шилдов. Заранее спасибо
@hypocrite420, 👍2
Обсуждение1 ответ
Лучший ответ:
Хорошо, вы ясно дали понять, что хотите использовать ESP в качестве последовательного моста к WIFI. У вас есть плата Node-MCU ESP12, которая обычно настроена для программирования с использованием Luna.
У вас должна быть правильная прошивка для этой «прошивки AI Thinker AT», и вам нужно найти правильную цепочку инструментов для ее загрузки на вашу плату. Честно говоря, было бы проще использовать ESP7 (или более раннюю версию), которая уже поставляется с правильной прошивкой.
Вы хотите связаться с ESP из Nano. Для этого вам нужно будет использовать последовательное программное обеспечение на Nano и перекрестно соединить последовательный порт программного обеспечения с последовательным портом ESP. Вам не следует подключаться к последовательному порту nano, это необходимо для программирования nano.
Чтобы настроить ESP для связи с беспроводной сетью, вам нужно будет отправить ему AT-команды (из nano), они должны быть частью настройки вашей программы. Технически это программирование ESP, но я думаю, вы с этим справитесь.
Теперь вы можете добавить датчик и библиотеку DHT-11, и все будет работать.
Однако
Вам будет намного проще загрузить пакет поддержки платы для ESP, взять один из примеров веб-сервера/клиента и добавить к нему код DHT-11. Вы обнаружите, что все это написано на том же диалекте C++, что и Arduino, и это очень просто. На самом деле самая большая проблема, с которой вы столкнетесь, — это найти что-нибудь, что утяжелило бы USB-кабель, чтобы он не перевернул Node-MCU.
Кстати, ваш код не компилируется, потому что вы оставили теги курсивной разметки, когда копировали его с веб-сайта. Попробуйте удалить все теги [i] и [/i].
Горила Большое спасибо, я как раз искал что-то столь же конкретное, как вы упомянули. Позвольте мне также просмотреть каждый шаг и посмотреть, что произошло. Кажется, ваш ответ более информативен и очень конкретен. Помимо всего прочего, позвольте мне ответить на несколько вопросов, основанных на ваших шагах: 1) Я думаю, что на плате установлена предустановленная прошивка, и для ее программирования я использовал Arduino IDE вместо Luna. Попробовал ESploere загрузить несколько файлов .lua, но по неизвестным (мне) причинам это не удалось. 2) Имело смысл. 3) мой ESP работает нормально при подключении. Wi-Fi или даже первый код для отправки данных на сервер MySQL просто не работал при добавлении библиотеки dht11., @hypocrite420
Я искал образец и получил две другие темы, направленные на достижение аналогичной цели: (1) https://arduinoprosto.ru/q/17787/communication-via-ip-adress-with-arduino-ide-and -esp8266?rq=1 (2) https://arduinoprosto.ru/q/35908/communication-between-two-esp8266?rq=1, @hypocrite420
ОБНОВЛЕНИЕ: Если кто-то ищет более простое решение: у меня есть что-то получше, где, кажется, мне не нужно использовать AT-команду каждый раз после однократной перепрошивки: http://www.instructables.com/id/ESP8266-Wifi-Add-on- для-Arduino-Made-Simple/, @hypocrite420
- Как спрогнозировать размер батареи, необходимый для проекта?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
Если вы пытаетесь отправить данные на сервер, я думаю, что соединение tx-tx и rx-rx, возможно, должно сработать. Или вы могли бы написать код, который читает сообщения Arduino и отправляет их на сервер., @Sagnik Pradhan
Пробовал обоими способами, не работает. И не знаю, как написать код в esp, который будет читаться из Arduino или другим способом. есть ли у вас рабочий пример кода? @ Сагник Прадхан See More, @hypocrite420
У меня действительно нет., @Sagnik Pradhan
@ hypocrite420 - Соединения должны быть Tx-Rx, а не Tx-Tx., @Code Gorilla
Похоже, вы установили свою собственную прошивку в ESP8266, а затем ожидаете, что сможете взаимодействовать с ним, как если бы на нем была установлена прошивка AT? Или вы написали в своем эскизе собственное программное обеспечение для управления передачей данных с Arduino на ESP8266, чтобы ESP8266 пересылал их через Интернет на выбранный вами сервер?, @Majenko
@Code Gorilla, я пробовал бот Tx-TX и TX-RX, но безуспешно., @hypocrite420
@Маженко, прежде всего, с этим ESP можно делать все, как и с другим Arduino. перед этим вам необходимо добавить скрипты поддержки в Arduino IDE. тогда вы сможете кодировать как arduino. например, вы можете написать мигающий код так же, как do2 arduino, скомпилировать и загрузить. когда вы загружаете свой код, он перезаписывает существующую прошивку ESP. в моем случае это работает хорошо, когда я пытаюсь подключиться или сканировать сети Wi-Fi. но не работает, когда я пытаюсь прочитать данные с датчика dht11. Итак, что я сделал, я поместил код чтения данных в Arduino и код подключения Wi-Fi в esp. я ожидал, что мой Arduino сможет подключиться к серверу таким образом, но нет, @hypocrite420
Я точно знаю, что такое ESP8266. Если вы просмотрите прилагаемые примеры в ядре ESP8266, вы найдете по крайней мере один, написанный мной. Чтобы использовать ESP8266 с платой Arduino, на ESP8266 должна быть установлена прошивка, которая взаимодействует с Arduino. Обычно ESP8266 поставляется с предустановленной прошивкой, которая называется «Прошивка AI Thinker AT». Или вы можете написать собственную прошивку для связи между двумя платами. Установка какой-нибудь случайной прошивки, которая сканирует точки доступа Wi-Fi и подключается к одной из них *** не позволит установить связь с Arduino, потому что у вас нет... ***, @Majenko
***...написана прошивка ESP8266, которая будет взаимодействовать с Arduino.***, @Majenko
@ hypocrite420 - Работает ли используемая вами библиотека DHT с ESP?, @Code Gorilla
@Маженко, извини, я новичок и понятия не имею, с кем разговаривал. простите за это. Кстати, я подумал, что ты тот самый человек, которого можно тогда спросить. позвольте мне перейти к делу: нет, я не писал ничего, что могло бы взаимодействовать между Arduino и ESP. Я просто подумал, что это будет работать так же, как Ethernet Shield, поэтому подключил TX-RX и RX-TX. однако я искал коды и нашел несколько, позволяющие разговаривать между ними. но мне не ясно, как загружать свои данные на сервер MySQL, где мне следует писать свой код, а также как мне общаться ? это будет выглядеть так: Sesnore->arduino->esp8266->mysql. просто не знаю точного способа., @hypocrite420
Самый простой способ — установить прошивку AI Thinker AT и следовать одному из многочисленных руководств по Arduino -> ESP8266. Не разговаривайте с MySQL — обратитесь к веб-сайту, который затем выполняет за вас транзакции MySQL (например, PHP)., @Majenko
@Code Gorilla нет, это не так. в противном случае я бы использовал ESP напрямую, пропуская часть Arduino Nano., @hypocrite420
@Маженко, моя точная версия ESP — NodeMCU 1.0 (ESP8266 12e), у которой есть USB-порт для подключения. Я видел множество руководств, в которых esp считывает данные нескольких датчиков и отправляет их на веб-сервер, но в моем случае я всегда получаю ошибку «Ошибка компиляции NodeMCU 1.0». есть идеи или предложения, как избавиться от этого? [я нашел руководство и последовал ему, дважды удалив папку старой версии из каталога ..\Arduino15\packages\esp8266\hardware\esp8266, но по-прежнему получаю ту же ошибку.] Нужно ли мне изменить файл библиотеки датчиков, предназначенный для ESP?, @hypocrite420
Если просто передать значения из DHT на SQL Server, существует множество примеров эскизов, использующих только NODECPU., @Rainer