Димиране на LED през WiFi мрежа - ESP32 / android APP
Използваме ESP32 devkit 1.
ESP32 работи в режим AP. Това означава, че модула ще е видим в WiFi със своето SSID.
Към него могат да се свържат като клиент различни модули, например телефон, компютър и т.н.
Дефинираме SSID и парола за да може клиент да се свърже към модула.
const char* ssid = "ESP32_AP_demo"; const char* password = "12345678";
IP на ESP32 може да се променя но в софтуера не е показано как се прави. Използва се фабрично зададения
IP: 192.168.4.1
Свързани са два LED - червен и зелен. През резистори 330 ома към изводи 26, 27.
// PIN definition const int GRN_led = 27; const int RED_led = 26;
Зеленият LED показва наличието на клиент, който се е свързал с модула.
Червеният лед е този, който ще се управлява през WiFi мрежата
Към него се подава PWM, така че да може да се регулира яркостта му. Честотата която е избрана е 1kHz и 255 стъпки (8 бита)
// setting PWM properties const int freq = 1000; const int ledChannel = 0; const int resolution = 8; unsigned char dutyCycle=0; // 0 do 255
Андроид апликацията е създадена в средата на MIT APP INVENTOR. Инсталационен apk файл може да бъде изтеглен
ТУК
Блоковата схема на апликацията е:
Чрез бутона се променя статуса на светодиода - on / off. Чрез плъзгача се задава яркостта на светене - стъпки PWM 1-254.
Предаването да данните е чрез POST request. Данните са пакетирани като json - {"led_status":"1","led_pwm":"123"}
В двете полета под плъзгача е изписано реалното състояние на параметрите, които ESP32 връща към апликацията като отговор
на post request.
А ето и целият код за ESP32 в Arduino среда
#include "WiFi.h" #include "WiFiClient.h" #include "ArduinoJson.h" //DynamicJsonDocument jsonBuffer(150); StaticJsonDocument<256> jsonBuffer; WiFiServer server(80);//, ser8000(8000); // PIN definition const int GRN_led = 27; const int RED_led = 26; // setting PWM properties const int freq = 1000; const int ledChannel = 0; const int resolution = 8; unsigned char dutyCycle=0; // 0 do 255 const char* ssid = "ESP32_AP_demo"; const char* password = "12345678"; //timeout for communication unsigned long currentMillis; unsigned char led_status=0; void setup() { // configure hardware and vars pinMode(GRN_led,OUTPUT);pinMode(RED_led,OUTPUT); digitalWrite(GRN_led,LOW); // WiFi.mode(WIFI_STA); // WiFi.begin(ssid,password); WiFi.softAP(ssid,password); server.begin(); Serial.begin(115200, SERIAL_8N1); // configure LED PWM functionalitites ledcSetup(ledChannel, freq, resolution); // attach the channel to the GPIO to be controlled ledcAttachPin(RED_led, ledChannel); ledcWrite(ledChannel, dutyCycle); } void loop() { String tmp; WiFiClient cl = server.available(); // Listen for incoming clients if (cl) { digitalWrite(GRN_led,HIGH); while (!cl.available()) delay(1); // wait for request String req = cl.readString(); // json is inside {} int a,b; a=req.indexOf('{');b=req.indexOf('}'); req=req.substring(a,b+1); Serial.println(req); // json is inside {} auto error = deserializeJson(jsonBuffer, req); if (error) { Serial.println(error.f_str());//"parseObject() failed"); } else { if (jsonBuffer.containsKey("led_status")==true) { led_status=jsonBuffer["led_status"]; Serial.println(String(led_status)); } if (jsonBuffer.containsKey("led_pwm")==true) { dutyCycle =jsonBuffer["led_pwm"]; } // predavam json s promenlivite cl.print("HTTP/1.1 200 OK\r\n");//\r\n\r\n"); //404 Not Found");// // sled OK da nqma interval cl.print("Content-Type: application/json\r\n\r\n"); tmp="{\"stat\" : \""+String(led_status)+"\",\"pval\" : \""+String(dutyCycle)+"\"}"; cl.print("\r\n"); cl.print(tmp); cl.stop(); } }else{digitalWrite(GRN_led,LOW);} if (led_status==0){ledcWrite(ledChannel, 0);}else{ledcWrite(ledChannel, dutyCycle);} }
Коментари
electro 2023-09-25 22:42:18 | How is this working |
ЕЛЕКТРОНИКС ДИЗАЙН ООД Фирма Електроникс Дизайн ООД е създадена 2007г гр. София. Дейността на фирмата е проектиране и производство на потребителска електроника. |
Контакти Телефон: 0898 518 261
e-mail: info@ekits.eu
Адрес: София бул. Европа 177 |
---|