Итак, овладел заливкой скетчей в ESP8266 (ESP-07).
Физически сделал три кнопки, подключенные к GPIO-0, RES, EN (он же CH-PD или что-то созвучное, но на плате ESP-07 он зовется как EN), второй конец кнопок - к земле (GND), эти же выводы подтянуты через 10кОм к +3.3В.
Для прошивки в нее скетча достаточно начать кнопку GPIO-0 (замкнуть на землю) и любую (как оказалось) из кнопок RES или EN. Потом нажать в Arduino-IDE на заливку скетча. Естественно должны быть залиты в Ардуино-ИДЕ все библиотеки - как это сделать полно информации в инете.
После заливки скетча он сразу же запускается.
Вот пример простенького скетча, который по запросу из браузера по команде http://192.168.1.72/gpio/t получает ответ о температуре и влажности, а по командам
http://192.168.1.72/gpio/4/1 или http://192.168.1.72/gpio/4/0 управляет состоянием вывода GPIO-4 (всего выведено 6 каналов для возможности управления).
Само устройство убрал в корпус из-под блока питания (совместно с БП на 5 вольт и стабилизатором на 3.3 В.
На устройстве задан статический IP 192.168.1.72
Можно аналогичные команды выполнять из командной строки, используя утилиту wget.exe.
Вот простенькие строки в bat-файле для проверки возможности
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/t
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/4/1
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/5/1
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/15/1
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/16/1
pause
Это что сделано.....
Теперь о том что хочется....
Физически сделал три кнопки, подключенные к GPIO-0, RES, EN (он же CH-PD или что-то созвучное, но на плате ESP-07 он зовется как EN), второй конец кнопок - к земле (GND), эти же выводы подтянуты через 10кОм к +3.3В.
Для прошивки в нее скетча достаточно начать кнопку GPIO-0 (замкнуть на землю) и любую (как оказалось) из кнопок RES или EN. Потом нажать в Arduino-IDE на заливку скетча. Естественно должны быть залиты в Ардуино-ИДЕ все библиотеки - как это сделать полно информации в инете.
После заливки скетча он сразу же запускается.
Вот пример простенького скетча, который по запросу из браузера по команде http://192.168.1.72/gpio/t получает ответ о температуре и влажности, а по командам
http://192.168.1.72/gpio/4/1 или http://192.168.1.72/gpio/4/0 управляет состоянием вывода GPIO-4 (всего выведено 6 каналов для возможности управления).
Само устройство убрал в корпус из-под блока питания (совместно с БП на 5 вольт и стабилизатором на 3.3 В.
На устройстве задан статический IP 192.168.1.72
Код:
#include <ESP8266WiFi.h>
#include <DHT.h>
#include <DHT_U.h>
#define All_GPIO_OUT 6
int GPIO_OUT[All_GPIO_OUT]= {4,5,13,14,15,16};
const char* ssid = "MyHomeWiFi";
const char* password = "My_password";
IPAddress ip(192, 168, 1, 73); //Node static IP
IPAddress gateway(192, 168, 1, 5);
IPAddress subnet(255, 255, 255, 0);
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
// датчик DHT:
const int DHTPin = 12;
// инициализируем датчик DHT:
DHT dht(DHTPin, DHTTYPE);
int GPIO_OUT_S[All_GPIO_OUT];
int i,j,val,ind;
String s;
long Tm,Tm1;
float t,h,hic;
// Create an instance of the server specify the port to listen on as an argument
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
dht.begin();
for(i=0;i<All_GPIO_OUT;i++)
{
pinMode(GPIO_OUT[i], OUTPUT);
digitalWrite(GPIO_OUT[i], 0);
GPIO_OUT_S[i]=0;
}
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
ind=0;
i=0;
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
i++;
if(i%2==0) digitalWrite(2, HIGH);
else digitalWrite(2, LOW);
}
Serial.println("");
Serial.println("WiFi connected");
digitalWrite(2, LOW);
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
Flash_GPIO();
return;
}
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String req = client.readStringUntil('\r');
Serial.println(req);
client.flush();
// Match the request
j=0;
val=-1;
for(i=0;i<All_GPIO_OUT;i++)
{
s="/gpio/"+String(GPIO_OUT[i])+"/0";
if (req.indexOf(s) != -1)
{
val = 0;
break;
}
s="/gpio/"+String(GPIO_OUT[i])+"/1";
if (req.indexOf(s) != -1)
{
val = 1;
break;
}
}
if (req.indexOf("/gpio/t") != -1)
{
val=2;
// данные от датчика могут запаздывать на 2 секунды
// (это очень медленный датчик):
h = dht.readHumidity();
// считываем температуру в Цельсиях (по умолчанию):
t = dht.readTemperature();
// проверяем, корректны ли считанные данные,
// и если нет, то выходим и начинаем заново:
if (isnan(h) || isnan(t) ) {
Serial.println("Failed to read from DHT sensor!");
// "Не удалось прочитать данные от датчика DHT"
s="DHT Failed";
}
else{
// рассчитываем градусы в Цельсиях а также влажность:
hic = dht.computeHeatIndex(t, h, false);
// все эти Serial.print() ниже можно удалить,
// т.к. они для отладочных целей:
Serial.print("Humidity: "); // "Влажность: "
Serial.print(h);
Serial.print(" %\t Temperature: "); // "Температура: "
Serial.print(t);
Serial.print(" *C ");
// "Тепловой индекс: "
Serial.print(hic);
Serial.print(" *C ");
s="T="+String(t)+" H="+String(h)+" Index="+String(hic);
}
}
if (req.indexOf("/gpio/h") != -1)
{
val=3;
}
if(val==-1) {
Serial.println("invalid request");
client.stop();
return;
}
if(val==0 || val==1)
{
digitalWrite(GPIO_OUT[i], val);
GPIO_OUT_S[i]=val;
s="";
// Prepare the response
// s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
s +="GPIO" +String(GPIO_OUT[i])+" is now ";
s += (val)?"high":"low";
// s += "</html>\n";
// Send the response to the client
}
client.flush();
client.print(s);
delay(10);
client.stop();
delay(1);
Serial.println("Client disonnected");
// The client will actually be disconnected
// when the function returns and 'client' object is detroyed
Flash_GPIO();
}
void Flash_GPIO()
{
int k=0;
Tm=millis()/1000;
if(Tm-Tm1>=2)
{
for(i=0;i<All_GPIO_OUT;i++)
if(GPIO_OUT_S[i]==1) k++;
if(k==0)
{
digitalWrite(2, HIGH);
delay(100);
digitalWrite(2, LOW);
}
else {
for(i=0;i<k;i++)
{
digitalWrite(2, HIGH);
delay(300);
digitalWrite(2, LOW);
delay(200);
}
}
Tm1=millis()/1000;
}
}
Можно аналогичные команды выполнять из командной строки, используя утилиту wget.exe.
Вот простенькие строки в bat-файле для проверки возможности
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/t
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/4/1
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/5/1
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/15/1
pause
call wget -t 1 -O wg.txt http://192.168.1.72/gpio/16/1
pause
Это что сделано.....
Теперь о том что хочется....