Virtuino ESP32
- Войдите на сайт для отправки комментариев
Чт, 30/06/2022 - 05:16
Всем добра.
Помогите разобрать кусочек кода, не могу понять его алгоритм работы, день потратил, ни чего толком не нагуглил(
Есть связка ESP32+Virtuino.
После старта устанавливает TCP соединение и держит его. А вот как клиент после каждого опроса отключается и подключается заново и так по циклу.
Вот что видно в терминале
WiFi connected
192.168.1.150
Connected
!Q23=?$!V03=?$!V04=?$!V07=?$!V08=?$!V09=?$
Received data: !Q23=?$!V03=?$!V04=?$!V07=?$!V08=?$!V09=?$
Response : !Q23=0$!V3=0.00$!V4=0.00$!V7=0.00$!V8=0.00$!V9=0.00$
Disconnected
Connected
!Q23=?$!V03=?$!V04=?$!V07=?$!V08=?$!V09=?$
Received data: !Q23=?$!V03=?$!V04=?$!V07=?$!V08=?$!V09=?$
Response : !Q23=0$!V3=0.00$!V4=0.00$!V7=0.00$!V8=0.00$!V9=0.00$
Disconnected
Как сделать так чтобы он постоянно подключен был?
/* Example: ESP32 - Control PWM pins * Created by Ilias Lamprou * Modified: Sep/22/2019 */ #include <WiFi.h> //--- SETTINGS ------------------------------------------------ const char* ssid = "GK+1"; // enter the name (SSID) of your WIFI network const char* password = "1274861234"; // enter your WIFI network PASSWORD WiFiServer server(8000); // Default Virtuino Server port IPAddress ip(192, 168, 1, 150); // where 150 is the desired IP Address. The first three numbers must be the same as the router IP IPAddress gateway(192, 168, 1, 1); // set gateway to match your network. Replace with your router IP //--- //---VirtuinoCM Library settings -------------- #include "VirtuinoCM.h" VirtuinoCM virtuino; #define V_memory_count 32 // the size of V memory. You can change it to a number <=255) float V[V_memory_count]; // This array is synchronized with Virtuino V memory. You can change the type to int, long etc. //--- boolean debug = true; // set this variable to false on the finale code to decrease the request time. //-- PWM settings const int channel_pin_17 = 0; // (enter a value between 0-15) const int channel_pin_23 = 1; int lastValuePWM_17=0; int lastValuePWM_23=0; //============================================================== setup //============================================================== void setup() { if (debug) { Serial.begin(9600); while (!Serial) continue; } virtuino.begin(onReceived,onRequested,512); //Start Virtuino. Set the buffer to 512. With this buffer Virtuino can control about 50 pins (1 command >= 9bytes) The T(text) commands with 20 characters need 20+6 bytes //virtuino.key="1234"; //This is the Virtuino password. Only requests the start with this key are accepted from the library connectToWiFiNetwork(); server.begin(); // pinMode(LED_BUILTIN,OUTPUT); // On Virtuino panel add a button to control this pin pinMode(17, OUTPUT); // On Virtuino panel add a regulator to control this pin pinMode(23, OUTPUT); // On Virtuino panel add a regulator to control this pin pinMode(4, INPUT); // On Virtuino panel add a led to get the state of this pin pinMode(19, INPUT); // On Virtuino panel add a led to get the state of this pin //---- setup for PWM pin 17 ledcSetup(channel_pin_17,5000,8); // channel setup: channel=0 freq=5000 resolution=8 ledcAttachPin(17, channel_pin_17); // attach the channel 0 to the pin 17 //---- setup for PWM pin 23 ledcSetup(channel_pin_23,5000,8); // channel setup: channel=1 freq=5000 resolution=8(8 bits = 0-255) ledcAttachPin(23,channel_pin_23); // attach the channel 1 to the pin 23 } //============================================================== loop //============================================================== void loop() { virtuinoRun(); // Necessary function to communicate with Virtuino. Client handler // enter your code below. Avoid to use delays on this loop. Instead of the default delay function use the vDelay that is located on the bottom of this code // You don't need to add code to read or write to the pins. Just enter the pinMode of each Pin you want to use on void setup //--- example to control the PWM pin 17. The virtual pin V0 contains the PWM value if (V[0]!=lastValuePWM_17) { // control the PWM pin every time the V0 is changed ledcWrite(channel_pin_17, V[0]); // write the value to the channel of pin 17 lastValuePWM_17=V[0]; // store the V0 value } //--- example to control the PWM pin 23. The virtual pin V1 contains the PWM value if (V[1]!=lastValuePWM_23) { // control the PWM pin every time the V0 is changed ledcWrite(channel_pin_23, V[1]); // write the value to the channel of pin 17 lastValuePWM_23=V[1]; // store the V0 value } //vDelay(1000); // This is an example of the recommended delay function. Remove this if you don't need } /*================= Virtuino Code ============================== You don't need to make changes to the code bellow */ //============================================================== connectToWiFiNetwork void connectToWiFiNetwork(){ Serial.println("Connecting to "+String(ssid)); // If you don't want to config IP manually disable the next two lines IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your network WiFi.config(ip, gateway, subnet); // If you don't want to config IP manually disable this line WiFi.mode(WIFI_STA); // Config module as station only. WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println(WiFi.localIP()); } //============================================================== onCommandReceived //============================================================== /* This function is called every time Virtuino app sends a request to server to change a Pin value * The 'variableType' can be a character like V, T, O V=Virtual pin T=Text Pin O=PWM Pin * The 'variableIndex' is the pin number index of Virtuino app * The 'valueAsText' is the value that has sent from the app */ void onReceived(char variableType, uint8_t variableIndex, String valueAsText){ if (variableType=='V'){ float value = valueAsText.toFloat(); // convert the value to float. The valueAsText have to be numerical if (variableIndex<V_memory_count) V[variableIndex]=value; // copy the received value to arduino V memory array } } //============================================================== /* This function is called every time Virtuino app requests to read a pin value*/ String onRequested(char variableType, uint8_t variableIndex){ if (variableType=='V') { if (variableIndex<V_memory_count) return String(V[variableIndex]); // return the value of the arduino V memory array } return ""; } //============================================================== void virtuinoRun(){ WiFiClient client = server.available(); if (!client) return; if (debug) Serial.println("Connected"); unsigned long timeout = millis() + 3000; while (!client.available() && millis() < timeout) delay(1); if (millis() > timeout) { Serial.println("timeout"); client.flush(); client.stop(); return; } virtuino.readBuffer=""; // clear Virtuino input buffer. The inputBuffer stores the incoming characters while (client.available()>0) { char c = client.read(); // read the incoming data virtuino.readBuffer+=c; // add the incoming character to Virtuino input buffer if (debug) Serial.write(c); } client.flush(); if (debug) Serial.println("\nReceived data: "+virtuino.readBuffer); String* response= virtuino.getResponse(); // get the text that has to be sent to Virtuino as reply. The library will check the inptuBuffer and it will create the response text if (debug) Serial.println("Response : "+*response); client.print(*response); client.flush(); delay(10); client.stop(); if (debug) Serial.println("Disconnected"); } //============================================================== vDelay void vDelay(int delayInMillis){long t=millis()+delayInMillis;while (millis()<t) virtuinoRun();}
Судя по всему что весь ребус вот в этом куске кода
Строки 150 и 166 ни на какие мысли не наводит ?
Я понимаю что они как раз разрывают соединение.
Если их закоментировать, то вообще не работает.
Про 150 логика работы ясна.
А вот про 166 я как раз и залип.
Вообще не работает - это как?
Не работает, это не соединяется с виртуиной, в терминале пусто.
Собственно решил вопрос установив false в 025 строке.
В самой виртуине поставил 0 в параметре периодичность опроса.
Но интуиция подсказывает что это костыль.