Использовать 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-шилдов. Заранее спасибо

, 👍2

Обсуждение

Если вы пытаетесь отправить данные на сервер, я думаю, что соединение 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


1 ответ


Лучший ответ:

0

Хорошо, вы ясно дали понять, что хотите использовать ESP в качестве последовательного моста к WIFI. У вас есть плата Node-MCU ESP12, которая обычно настроена для программирования с использованием Luna.

  1. У вас должна быть правильная прошивка для этой «прошивки AI Thinker AT», и вам нужно найти правильную цепочку инструментов для ее загрузки на вашу плату. Честно говоря, было бы проще использовать ESP7 (или более раннюю версию), которая уже поставляется с правильной прошивкой.

  2. Вы хотите связаться с ESP из Nano. Для этого вам нужно будет использовать последовательное программное обеспечение на Nano и перекрестно соединить последовательный порт программного обеспечения с последовательным портом ESP. Вам не следует подключаться к последовательному порту nano, это необходимо для программирования nano.

  3. Чтобы настроить ESP для связи с беспроводной сетью, вам нужно будет отправить ему AT-команды (из nano), они должны быть частью настройки вашей программы. Технически это программирование ESP, но я думаю, вы с этим справитесь.

  4. Теперь вы можете добавить датчик и библиотеку 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