Salve a tutti, sto sviluppando un progetto di controllo di un robot su ruote controllato da arduino, a suo volta controllato con un interfaccia web su un esp32 heltec.
Innanzitutto vi mostro il codice:
-Esp32
#include "WiFi.h"
#include "heltec.h"
const char* ssid = "wifi";
const char* password = "passwordwifi";
WiFiServer server(80);
// Assign output variables to GPIO pins
const int Forward = 22;
const int Backward = 19;
const int Left = 23;
const int Right = 18;
const int Stop = 5;
const int AddTen = 17;
const int RemTen = 16;
int Speed=100;
const int Out=4;
const int In=5;
int val=0;
void setup() {
// Start all
Serial.begin(9600);
Heltec.begin(true /*DisplayEnable Enable*/, false /*LoRa Enable*/, true /*Serial Enable*/);
// Initialize the output variables as outputs
pinMode(Forward, OUTPUT);
pinMode(Backward, OUTPUT);
pinMode(Left, OUTPUT);
pinMode(Right, OUTPUT);
pinMode(Stop,OUTPUT);
pinMode(AddTen, OUTPUT);
pinMode(RemTen, OUTPUT);
// Set outputs to LOW
digitalWrite(Forward, LOW);
digitalWrite(Backward, LOW);
digitalWrite(Left, LOW);
digitalWrite(Right, LOW);
// Connect to Wi-Fi network with SSID and password
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
Heltec.display -> clear();
Heltec.display -> drawString(1, 1, (String)(Speed));
Heltec.display -> display();
}
void loop(){
WiFiClient client = server.available(); // Listen for incoming clients
// Connect, verify connection and get data
if (client) { // If a new client connects,
Serial.println("New Client."); // print a message out in the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
Heltec.display -> clear();
Heltec.display -> drawString(x, 1, String(Speed));
Heltec.display -> display();
}
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
currentLine.concat(c);
if (c == '\n') { //se arrivo a fine riga
if(currentLine.indexOf("/Forward/1")>0) { //controllo che nell'url ci sia led=1
digitalWrite(Forward, HIGH); //se c'è accendo il led
}
else {
digitalWrite(Forward, LOW); //altrimenti spengo il led
}
if(currentLine.indexOf("/Backward/1")>0) { //controllo che nell'url ci sia led=1
digitalWrite(Backward, HIGH); //se c'è accendo il led
}
else {
digitalWrite(Backward, LOW); //altrimenti spengo il led
}
if(currentLine.indexOf("/Left/1")>0) { //controllo che nell'url ci sia led=1
digitalWrite(Left, HIGH); //se c'è accendo il led
}
else {
digitalWrite(Left, LOW); //altrimenti spengo il led
}
if(currentLine.indexOf("/Right/1")>0) { //controllo che nell'url ci sia led=1
digitalWrite(Right, HIGH); //se c'è accendo il led
}
else {
digitalWrite(Right, LOW); //altrimenti spengo il led
}
if(currentLine.indexOf("/Stop/1")>0) { //controllo che nell'url ci sia led=1
digitalWrite(Stop, HIGH); //se c'è accendo il led
}
else {
digitalWrite(Stop, LOW); //se c'è accendo il led
}
if(currentLine.indexOf("/Adder/10")>0) { //controllo che nell'url ci sia led=1
digitalWrite(AddTen, HIGH); //se c'è accendo il led
Speed=Speed+10;
}
else {
digitalWrite(AddTen, LOW); //se c'è accendo il led
}
if(currentLine.indexOf("/Remover/10")>0) { //controllo che nell'url ci sia led=1
digitalWrite(RemTen, HIGH); //se c'è accendo il led
Speed=Speed-10;
}
else {
digitalWrite(RemTen, LOW); //se c'è accendo il led
}
// Create the web page
client.println("HTTP/1.1 200 OK"); //dico al client che è tutt'ok - standard http
client.println("Content-Type: text/html"); //indico il formato - standard http
client.println(); //necessario per non buggare
client.println("<html>"); //inizio codice html
client.println("<style type=\"text/css\">body{text-align: center; background-color: #4BC04F; font-family: sans-serif;}");
client.println("#Display{padding: 0px; margin: 0 auto; background-color: white; border: 1px solid black; border-radius: 50px; text-align: center; width: 330px; height: 500px; margin-top: 50px;}");
client.println("#Forward{padding: 15px; text-align: center; margin: 0 auto; margin-top: 50px; margin-bottom: 0px;}");
client.println("#Left{padding: 15px; text-align: center; margin: 0 auto; margin-top: 10px; padding-right:24px; padding-left:20px;}");
client.println("#Right{padding: 15px; text-align: center; margin: 0 auto; margin-top: 10px; padding-right: 20px;}");
client.println("#Backward{padding: 15px; text-align: center; margin: 0 auto; margin-top: 10px;}.adder{padding: 15px; text-align: center; margin: 6px; margin-top: 20px;}");
client.println("#Stop{padding: 12px; margin: 0px; width: 60px; margin-left:12px; margin-right:12px;}</style>");
client.println("<head><link rel=\"icon\" href=\"data:,\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>Controllo Robot</title></head>");
client.println("<body><div id=\"Display\"><input type=\"submit\" id=\"Forward\" value=\"Forward\" onclick=\"ChangeURL('/Forward/1')\"/>
");
client.println("<input type=\"submit\" id=\"Left\" value=\"Left\" onclick=\"ChangeURL('/Left/1')\"/><input type=\"submit\" id=\"stop\" value=\"Stop\" onclick=\"ChangeURL('/Stop/1')\"/>");
client.println("<input type=\"submit\" id=\"Right\" value=\"Right\" onclick=\"ChangeURL('/Right/1')\"/>
<input type=\"submit\" id=\"Backward\" value=\"Backward\" onclick=\"ChangeURL('/Backward/1')\"/>
");
client.println("<button id=\"+10\" class=\"adder\" onclick=\"ChangeURL('/Remover/10')\">Rem 10</button>");
client.println("<button id=\"+10\" class=\"adder\" onclick=\"ChangeURL('/Adder/10')\">Add 10</button>");
client.print("<script type=\"text/javascript\">");
client.print("function ChangeURL(Url){window.location.href = Url;}");
client.print("function DelUrl(){window.location.href=\"/\";}");
client.print("if(window.location.href==\"http://192.168.1.37/Remover/10\" || window.location.href==\"http://192.168.1.37/Adder/10\"){setTimeout(DelUrl,150);}");
client.print("</script></body>");
client.println("</html>");
client.stop(); //stop richieste dal client
currentLine="";
}
}
}
}
}
Il codice su arduino non è importante per farvi capire, comunque il primo problema è dato dal fatto che a volte per connettermi alla pagina creata sull’esp32 ci vogliano anche 40 secondi, e una volta preso il controllo del robot, magari schiacciando su un tasto, ci vogliono anche 10/20 secondi prima che funzioni effettivamente oppure altre volte non va proprio ed esce la schermata del sito irraggiungibile.
Il secondo problema è legato alla stampa di alcune informazioni sullo schermo oled dell’esp32.
Per stampare qualcosa sullo schermo si usano queste funzioni:
Heltec.display -> clear();
Heltec.display -> drawString(x, y, "");
Heltec.display -> display();
ed io voglio stampare la variabile Speed che mi indica la velocità attuale del robot (min:0-max:255), però il problema è che la prima volta viene stampata perchè le funzioni sono all’interno del void setup(), invece successivamente, ovviamente all’interno del void loop(), non me la stampa più e non riesco a capirne il motivo.
Se qualcuno riuscisse ad aiutarmi gliene sarei grato.
Grazie