Прежде чем обсуждать проблему, с которой вы столкнулись, вам необходимо понять два различных способа использования ESP8266:
- Использовать его как модем WiFi;
- Использовать его в качестве автономного MCU.
При использовании его в качестве модема WiFi вы связываетесь с ним с помощью AT-команды, и по умолчанию это то, что делает большинство модулей ESP8266, он поставляется с At- прошивка команды.
Когда вы используете ESP8266 в качестве MCU, вы набираете sh ESP8266 с эскизом Arduino, который переопределяет прошивку AT-Command и загружает ее с загрузчиком Arduino, и позволяет использовать ESP8266 как автономный MCU, такой как Arduino.
Вы упомянули, что вы можете без проблем общаться с ESP8266 при использовании Arduino Uno, что предполагает, что вы общались с ESP8266 с помощью AT-команды (и вашего кода предположил, что это так).
Когда вы загружаете эскиз Arduino в ESP8266, чтобы использовать его в качестве автономного MCU, вам необходимо соединитесь с ESP8266, используя библиотеку Arduino, такую как ESP8266WiFi
, которая позаботится о низком уровне связи с чипом ESP8266. Вот почему вы можете установить sh WiFi, используя возможности, предоставляемые ESP8266WiFi
классом.
Однако ваш код в вашем updateTemp()
все еще использует AT-команду, которая больше не работает. Вам понадобится либо библиотека ESP8266WebClient
, либо ESP8266HTTPClient
(эта проще и проще) для установления http-соединения. Вот код, который я изменил для использования библиотеки ESP8266HTTClient
для обработки HTTP-запросов. Кстати, код скомпилирован хорошо, но я не тестировал его с сервером thinkpeak, поскольку я не использую thinkpeak и не имею для этого API-ключа.
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define SSID "<REMOVED>" //your network name
#define PASS "<REMOVED>" //your network password
#define API "<REMOVED>" //api string
#define IP "api.thingspeak.com" // thingspeak.com
#define PORT 80
#define DHTPIN 4 // what pin the DHT sensor is connected to
#define DHTTYPE DHT22 // Change to DHT22 if that's what you have
#define BAUD_RATE 115200 //Another common value is 9600
#define DELAY_TIME 300000 //time in ms between posting data to ThingSpeak
DHT dht(DHTPIN, DHTTYPE);
//this runs once
void setup()
{
Serial.begin(BAUD_RATE);
// Connect to WIFI
WiFi.begin(SSID, PASS);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print("*");
}
Serial.println("");
Serial.println("Wifi Connection Successful");
Serial.print("The IP Address of the Sensor is:");
Serial.println(WiFi.localIP());
//initalize DHT sensor
dht.begin();
}
//this runs over and over
void loop() {
float h = dht.readHumidity();
Serial.print("Humidity: ");
Serial.println(h);
// Read temperature as Fahrenheit (isFahrenheit = true)
float c = dht.readTemperature();
Serial.print("Temperature: ");
Serial.println(c);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(c)) {
Serial.println("Reading DHT22 Failed, exiting");
return;
}
//update ThingSpeak channel with new values
updateTemp(c, h);
//wait for delay time before attempting to post again
delay(DELAY_TIME);
}
bool updateTemp(float tempC, float humid) {
WiFiClient client; // Create a WiFiClient to for TCP connection
if (!client.connect(IP, PORT)) {
Serial.println("HTTP connection failed");
return false;
}
Serial.println("Sending data to server");
if (client.connected()) {
client.print("GET /update?api_key="); client.print(API);
client.print("&field1="); client.print(String(tempC));
client.print("&field2="); client.print(String(humid));
client.println(" HTTP/1.1");
client.print("Host: "); client.println(IP);
client.println("Connection: close");
client.println(); //extra "\r\n" as per HTTP protocol
}
// wait for data to be available
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println("HTTP Client Timeout !");
client.stop();
return false;
}
}
Serial.println("Receiving HTTP response");
while (client.available()) {
char ch = static_cast<char>(client.read());
Serial.print(ch);
}
Serial.println();
Serial.println("Closing TCP connection");
client.stop();
return true;
}