comunicazione wifi seriale

Ciao a tutti.
sono un novellino e mi sto avvicinando alla programmazine

.. chiedo aiuto per questo problema:
sto cercando di far comunicare dei valori angolari di servi ad arduino tramite browser web su arduino uno wifi rev2

la connessione di arduino funziona, la parte web comuinica ad arduino la stringa con i valori e li visualizzo nel monitor seriale, ma non riesco a passare i valori letti sul monitor seriale alle variabili "int" che poi mi posizioneranno i servi.

:frowning: >:( >:(

GET /?srs è la stringa che recupero dalla pagina web... e sotto il serial.print che mi dovrebbe leggere i valori convertiti in numeri interi

help... ho allegato lo sketch... non riseco ad incollarlo con i tag

Cattura.PNG

Cattura.PNG

servi_control.ino (4.03 KB)

servi_control.ino (4.03 KB)

servi_control.ino (4.03 KB)

Se ricevi la stringa corretta su arduino, il problema dovrebbe essere sull'uso dei metodi substring e conversione a interi.
Usare la classe string provoca deframmentazione della memoria, la memoria viene allocata e deallocata di continuo, e ci si ritrova con porzioni di memoria continue troppo piccole per contenere i dati. Ossia la memoria viene liberata, ma ti ritrovi porzioni di memoria utilizzabile di pochi byte.
Il fatto che fai un uso molto intenso della classe string, e se la classe string non ti da problemi a te, vorrebbe dire che tutti i discorsi che si fanno non sarebbero veritieri.
Dovresti rivedere il tuo codice, sostituendo gli oggetti string, con array di char e utilizzare le funzioni del C come strcmp(), strcpy(), atoi(), rispettivamente per confrontare, copiare, e convertire stringhe in interi.

Il codice non funziona come ti aspetti perché stai sbagliando il posizionamento di tutte le substring().

Prova a stampare le stringhe temporanee al posto dei valori int e ti rendi conto subito del perché.
Poi una volta che funziona, butta tutto ed usa un metodo più sicuro per fare il parsing della stringa ;D

Concordo con i consigli precedenti ossia su Arduino evita le “String” come la peste devi usare le “stringhe C” ossia array di char, e una volta fatto, il parsing della stringa si fa con la funzione strtok() (che fa parte delle funzioni del C/C++ presenti anche su Arduino).

Ho solo due cose: intanto non capisco perché in http usi il GET e non POST, ma questo anche se formalmente sarebbe più corretto, è teoricamente ininfluente.

Seconda cosa, togli il gatto che ti cammina su barra spaziatrice e soprattutto sul tasto Invio. :wink:
Il tuo gatto ha reso il listato quasi illeggibile viste le tante, completamente inutili, righe vuote, e con indentazioni quasi “casuali”. Se vuoi separare “visivamente” qualche blocco di codice usa UNA sola riga vuota. Inoltre indenta sempre allo stesso modo, non mettere righe con 4 spazi e altre con 2 o 3, ed altre senza alcuna indentazione. Premi Ctrl-T nell’IDE e te lo sistema lui e da quel momento cerca di mantenere quel formato, che è “standard”. Tutto questo non è per una qualche forma di precisione, ma è per permetterti di capire meglio e più rapidamente ad occhio la struttura del programma, ma anche/soprattutto per agevolare NOI: se metti un codice che si legge con difficoltà, riduci il numero di persone disposte a perdere tempo per aiutarti…

Terza cosa, non ho capito quale sia il problema ad incollare il testo, devi semplicemente farlo precedere dal tag “code” e seguire dal tag di chiusura “/code” (entrambi con le quadre ovviamente).
Oppure nell’editor selezioni il pulsante “[/]” in alto a sinistra, e dentro ai due tag ci incolli il testo del listato.

Ecco il tuo codice, indentato per bene e senza le tante righe vuote, vedi com’è più facilmente leggibile:

#include <SPI.h>
#include <WiFiNINA.h>
#include <Servo.h>

#define SERV1 8    //servo 1 on digital port 8
#define SERV2 9    //servo 2 on digital port 9
#define SERV3 10   //servo 3 on digital port 10
#define SERV4 11   //servo 4 on digital port 11
#define SERV5 12   //servo 5 on digital port 12
#define SERV6 13   //servo 6 on digital port 13

Servo s1; //servo 1
Servo s2; //servo 2
Servo s3; //servo 3
Servo s4; //servo 4
Servo s5; //servo 5
Servo s6; //servo 6

int angle1 = 90; //servo 1 current angle
int angle2 = 90; //servo 2 current angle
int angle3 = 90;  //servo 3 current angle
int angle4 = 90; //servo 4 current angle
int angle5 = 90; //servo 5 current angle
int angle6 = 90; //servo 6 current angle
int servo_speed = 6; //speed of the servos

int angle1sp = 90; //servo 1 set point
int angle2sp = 90; //servo 2 set point
int angle3sp = 90;  //servo 3 set point
int angle4sp = 90; //servo 4 set point
int angle5sp = 90; //servo 5 set point
int angle6sp = 90; //servo 6 set point

boolean display_angles = true; //boolean used to update the angle of each servo on Serial Monitor
char ssid[] = "Leoni_P2_4";      //  NOME RETE
char pass[] = "**NASCOSTA**";   // PASSWORD RETE
int status = WL_IDLE_STATUS;     // STATO RADIO
WiFiServer server(80);

void setup(){
  //attach each servo to a pin and start its position
  s1.attach(SERV1);
  s1.write(angle1);
  s2.attach(SERV2);
  s2.write(angle2);
  s3.attach(SERV3);
  s3.write(angle3);
  s4.attach(SERV4);
  s4.write(angle4);
  s5.attach(SERV5);
  s5.write(angle5);
  s6.attach(SERV6);
  s6.write(angle6);
 
  Serial.begin (9600);

  String fv = WiFi.firmwareVersion();

  // ATTESA CONNSESSIONE ALLA RETE
  while ( status != WL_CONNECTED) {
    Serial.print("CONNESSIONE IN CORSO ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);
    // TEMPO CONNSESSIONE 10 SECONDI:
    delay(5000);
  }  
  // CONNSESSIONE RIUSCITA
  Serial.print("SEI CONNESSO ALLA RETE");
  Serial.print(" INDIRIZZO IP:");
  IPAddress myAddress = WiFi.localIP();
  Serial.println(myAddress);
  
  server.begin(); 
}

void loop() {  
  WiFiClient client = server.available();   
  if (client) {                             
    String currentLine = "";               
    while (client.connected()) {           
      if (client.available()) {             
        char c = client.read();             
        Serial.write(c);                   
        if (c == '\n') {                   
          String msg;
          Serial.find("GET");        
          //msg = Serial.readStringUntil(' '); 
          Serial.print(msg);
          String command = msg.substring(0, 3); 
          String valueStr1 = msg.substring(4, 7);   
          String valueStr2 = msg.substring(8,11);   
          String valueStr3 = msg.substring(12,15);   
          String valueStr4 = msg.substring(16,19);   
          String valueStr5 = msg.substring(20,23);   
          String valueStr6 = msg.substring(24,27);   
          int angle1sp = valueStr1.toInt();         
          int angle2sp = valueStr2.toInt();         
          int angle3sp = valueStr3.toInt();         
          int angle4sp = valueStr4.toInt();         
          int angle5sp = valueStr5.toInt();        
          int angle6sp = valueStr6.toInt();         
       
          Serial.print(msg);
          Serial.print(command);
          Serial.print(": ");
          Serial.print(angle1sp);
          Serial.print(", ");
          Serial.print(angle2sp);
          Serial.print(", ");
          Serial.print(angle3sp);
          Serial.print(", ");
          Serial.print(angle4sp);
          Serial.print(", ");
          Serial.print(angle5sp);
          Serial.print(", ");
          Serial.println(angle6sp);

          client.stop();
          Serial.println("client disonnected");
        }
      }
    }
  }
}

Ultima cosa, magari evita di riportare anche la password della tua WiFi (modifica il tuo primo post e cancellala…).

hahahah grazie mllle... mi sembra molto piu chiaro....
è che a forza di fare delle modifiche, copia incolla ecc... ho fatto un po di casino

comunque complimenti.... bravi.... spero piano piano di arrivare ai vostri livelli
:slight_smile: :slight_smile: :slight_smile: :slight_smile:

grazie a docdoc. per la "pulizia"...
per il tag mi diceva che supero i 9000 caratteri nel post.... forse proprio colpa di tutti gli spazi buttati a caso (colpa del mio gatto)...

le password mi sono "scappate"... dopo quattro ore che ero sopra a fare delle prove e leggere dei forum ero un po "bollito" mò le cambio

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.