• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Arduino + ESP8266 01 Вместо Ethernet Shield

ilya_520

New member
Добрый вечер товарищи. Ткните носом в мануал, как сделать так, чтобы данные с датчиков, подключенных к Ардуино передавались на сервер посредством WiFi (ESP8266). Есть рабочий скетч, но для ethernet shield'a. То есть вопрос по сути в том, как в этой нехитрой ситуации заменить ethernet на ESP.
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@ilya_520 ситуация не такая уж и не хитрая. Придётся полностью переписывать скетч, поскольку логика работы шилда и ESP с прошивкой АТ отличается кардинально.
Проще будет полностью перенести скетч на ESP в Ардуно ИДЕ, заменив скетч на Ардуино (если оно нужно будет) на простое расширение портов. Но лучше от Ардуино отказаться вообще.
 

ilya_520

New member
Вот скетч

Код:
#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Ethernet.h>
// библиотека для работы I²C
#include <Wire.h>

#include <TroykaIMU.h>
#include <iarduino_DHT.h>  

#define PHONE_NUMBER  "+79030000000"
#define MESSAGE  "Hello from GPRS Shield"
GPRS gprs;
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };
EthernetClient client;
char server[] = "192.168.1.139";
iarduino_DHT sensor(7);

Barometer barometer;

void setup()
{
  Ethernet.begin(mac);
  gprs.powerUpDown();

  Serial.begin(9600);

  Serial.println("Begin init...");

  barometer.begin();

  Serial.println("Initialization completed");
  while (!gprs.init()) {
    delay(1000);
    Serial.print("Init error\r\n");
  }
  Serial.println("GPRS init success");
  Serial.println("Start to send message ...");
  gprs.sendSMS(PHONE_NUMBER, MESSAGE);
}

void loop()
{
  float pressure = barometer.readPressureMillimetersHg();
  float altitude = barometer.pressureToAltitudeMeters(pressure);
  float temperature = barometer.readTemperatureC();
  sensor.read();
  Serial.print("p: ");
  Serial.print(pressure);
  Serial.print(" mbar \t");
  Serial.print("h: ");
  Serial.print(altitude);
  Serial.print(" m \t");
  Serial.print("t: ");
  Serial.print(temperature);
  Serial.println(" C");
  if (client.connect(server, 80))
  {
    client.print( "GET /arduino/add_data.php?");
    client.print("temperature=");
    client.print( sensor.tem );
    client.print("&");
    client.print("humidity=");
    client.print( sensor.hum );
    client.print("&");
    client.print("co2=");
    client.print( analogRead(A0) );
    client.print("&");
    client.print("pressure=");
    client.print( pressure );
    client.println( " HTTP/1.1");
    client.print( "Host: " );
    client.println(server);
    client.println( "Connection: close" );
    client.println();
    client.println();

    delay(60000);

  
    client.stop();
    client.flush();
    delay(100);
  }
  delay(5000);
}
 

ilya_520

New member
Кстати, задам еще вопрос. ESP8266-01 иногда начинает сильно греться, и в порт сыпет мусор. Помогает пару-тройку раз передернуть питание. Грешу на контакты, так как собрано все на макетке, но я его не трогаю и не перемещаю. Просто вдруг отваливается и начинает греться...
 

ilya_520

New member
Отвечу сам, на оба своих вопроса.

1. Нагрев
Дело было в контактах, как и предполагалось. При нормальном соединении все работает как часы. Видимо ESP8266 очень привередлива по питанию, тогда как остальные датчики на макетке работают нормально.

2. Замена Ethernet на ESP8266
Использовал библиотеку ESP8266pro. Ниже рабочий скетч.
Код:
#include <SoftwareSerial.h>
#include <Wire.h>
#include <TroykaIMU.h>
#include <iarduino_DHT.h>   // подключаем библиотеку для работы с датчиком DHT
#include <ESP8266pro.h>
#include <ESP8266proClient.h>

SoftwareSerial espSerial(10, 11); // RX, TX
ESP8266pro wifi(espSerial, Serial); // Serial, DebugSerial

const char* ssid = "SSID_NAME";
const char* password = "SSID _PASS";

iarduino_DHT sensor(7);

// создаём объект для работы с барометром
Barometer barometer;

void setup()
{

  barometer.begin();

  espSerial.begin(9600);
  Serial.begin(9600);

  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("Starting");

  // Initialize ESP
  wifi.begin(); // Disable all debug messages

  // Connect to WiFi network
  // In future ESP should automatically reconnect
  // to this network, if requried
  do
  {
    if (!wifi.stationConnect(ssid, password))
      delay(3000);
  } while (wifi.stationIP() == NULL_IP);

  Serial.print("ESP IP: ");
  Serial.println(wifi.stationIP());

}

void printResponse(ESP8266proConnection* connection,
          char* buffer, int length, boolean completed)
{
  Serial.print(buffer);
}

void loop()
{
  String tt = "GET /arduino/add_data.php?temperature=";
  String ttt = "&humidity=";
  String tttt = "&co2=";
  String ttttt = "&pressure=";
  String e = " HTTP/1.1\r\nHost: 192.168.1.139\r\n\r\n";

  // создаём переменную и присваиваем ей значения абсолютного давления
  float pressure = barometer.readPressureMillimetersHg();

  sensor.read();

  tt += sensor.tem;
  tt += ttt;
  tt += sensor.hum;
  tt += tttt;
  tt += analogRead(A0);
  tt += ttttt;
  tt += pressure;
  tt += e;

  ESP8266proClient con(wifi, printResponse);
  con.connectTcp("192.168.1.139", 80);
  con.send(tt);
  con.waitResponse();
  con.close(); // Completed!
  delay(30000);

}
Сорри за названия переменных ) Делалось для теста )


Так же, приведу код файла add_data.php (вдруг кому интересно):
PHP:
<?php
    require 'db.php'; // тут настройки БД
    // Получаем то что передает Ардуино
    $temp = $_GET['temperature'];
    $humidity = $_GET['humidity'];
    $co2 = $_GET['co2'];
    $pressure = $_GET['pressure'];
    // Дата
    $date = date("Y-m-d G:i:s");
    // Вставляем полученные данные в БД
    $add_user_query = "INSERT INTO sensorsdata (temp,humidity,data, co2, pressure) VALUES ('$temp', '$humidity', '$date', '$co2', '$pressure')";

    $add_user = mysqli_query($connect, $add_user_query);
    // Возвращаем текст
    if($add_user){
        echo "Data Saved!";
    }

?>
UPD:
Как-то странно ведет себя ESP. Первые 5-10 соединений проходят на ура, причем при попытке закрыть коннект (AT+CIPCLOSE=5) всегда в ответ приходит NO RESPONSE. А после на попытку соединиться с сервером отвечает ERROR. Пока не понял почему.

Прошивка AT v0.23 SDK 1.0.1 flash 512k, качал отсюда.

UPD2:
Вроде нашел решение. В классе библиотеки надо добавить задержки после выполнения определенных команд.

В файле ESP8266pro.cpp (добавлен delay в двух местах):
Код:
// 1 = Station mode
    execute("AT+CWMODE=1");
    delay(9000);
    // 1 = multiple connection
    if (!execute("AT+CIPMUX=1"))
    {
        restart(); // Trying to restart module
        execute("AT+CIPMUX=1");
        delay(4000);
    }
В скетче (добавлен delay после соединения с сервером):
Код:
con.connectTcp("192.168.1.139", 80);
  delay(4000);
  con.send(tt);
  con.waitResponse();
  delay(2000);
  con.close(); // Completed!
 
Последнее редактирование:
  • Like
Реакции: KomX
Сверху Снизу