0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« on: February 14, 2013, 10:55:12 am » |
ciao ragazzi... sto provando a configurare in rete ethernet o in bus i2C arduino. nel primo caso lo collego al pc tramite cross, o al router al quale è anche connesso il pc, nel secondo caso invece ad un altra scheda arduino.
il problema che incontro però rimane sempre lo stesso: posso inviare delle parole al posto di caratteri singoli o numeri singoli?
Infatti se invio delle parole tramite Wire.write, posso vedere tramite monitor seriale che arrivano alla scheda ricevente, ma la stessa non è in grado di interpretarle... cioè, se invio un singolo carattere tipo "A" arriva e accende il classico led, invece se invio "accendi", pur ricevendo la parola non accende niente... come mai? ci sto provando da una settimana...
|
|
|
|
« Last Edit: February 18, 2013, 05:40:34 am by matt-korban »
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 87
Posts: 8493
:(){:|:&};:
|
 |
« Reply #1 on: February 14, 2013, 04:03:33 pm » |
metti il codice che usi 
|
|
|
|
|
Logged
|
|
|
|
|
ivrea (to)
Offline
God Member
Karma: 15
Posts: 911
|
 |
« Reply #2 on: February 15, 2013, 03:15:24 am » |
A naso, senza vedere il tuo codice, mi sa che non usi il confronto giusto fra le stringhe. Il C non è Basic. In basic puoi fare If val$="accendi" Then non in C. Se usi come stringa un array di char, e fai if(arrchar=="accendi") viene fatto il confronto fra puntatori a indirizzo alle zone di memoria di dove inizia il vettore e dove è memorizzato "accendi". Se usi String, devi usare la funzione equals() apposita. if( s.equals("accendi")) http://arduino.cc/en/Tutorial/StringComparisonOperatorsdal manuale potresti fare if(s1==s2) ma credo che non puoi fare if(s1="accendi") perchè la parola tra doppi apici NON è un object String ma un vettore di caratteri.
|
|
|
|
« Last Edit: February 15, 2013, 09:22:48 am by nid69ita »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« Reply #3 on: February 16, 2013, 06:24:31 am » |
Ciao ragazzi e grazie! ecco vi posto il codice che ho fatto... sono nuovo in questo mondo quindi capirete gli errori... #include <Wire.h>
void setup() { Wire.begin(); Serial.begin(9600); pinMode(8, OUTPUT); }
void loop() { Wire.requestFrom(2, 7); while(Wire.available()) { char c = Wire.read(); Serial.print(c); if (c=='Accendi ') { digitalWrite(8, HIGH); delay(1000); } else if (c=='B'){ digitalWrite(8, LOW); } } delay(1000); }
|
|
|
|
|
Logged
|
|
|
|
|
ivrea (to)
Offline
God Member
Karma: 15
Posts: 911
|
 |
« Reply #4 on: February 16, 2013, 09:10:27 am » |
Infatti l'errore è char c = Wire.read(); Serial.print(c); if (c=='Accendi ') // errore {
c è dichiarata char, perciò può contenere solo un carattere. Dal Wire la read ha letto un solo carattere, perciò non puoi confrontarlo con "Accendi", al massimo puoi fare if(c=='A') per poter usare un comando tipo "Accendi" devi leggere un tot di caratteri dal Wire e metterli in un vettore di char (char vet[10]; esempio) oppure in un oggetto String (esempio String str;)
|
|
|
|
« Last Edit: February 16, 2013, 09:15:47 am by nid69ita »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« Reply #5 on: February 16, 2013, 09:33:07 am » |
ok... infatti per ora ho usato solo caratteri e funziona bene... vorrei però poter usare delle stringhe o dei cluster di char... ma la differenza quale sarebbe???? cioè un insieme di char (caratteri) viene chiamato cluster ma è sempre un insieme di caratteri? mentre una stringa è una parola intera o un numero con più cifre? ora sto provando sia con la funzione string, che con il vettore di char... se avete altri consigli mi fate sapere??? grazie 
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« Reply #6 on: February 16, 2013, 11:24:33 am » |
cioè io ci sto provando, davvero, ma non ne cavo piede! non riesco ad inviare una stringa e a riceverla dicendogli di accendere un led del cavolo... bo...
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« Reply #7 on: February 16, 2013, 11:51:17 am » |
vi posto il codice con le modifiche che ho provato a fare... master reader----------------------------------------------- #include <Wire.h> char vet[8];
void setup() { Wire.begin(); Serial.begin(9600); pinMode(8, OUTPUT); }
void loop() { Wire.requestFrom(2, 7);
while(Wire.available()) { char A = Wire.read(); Serial.print(A); if (vet =="accendi"){ digitalWrite(8, HIGH); delay(1000); } delay(1000); } }
slave sender------------------------------------------- #include <Wire.h>
void setup() { Wire.begin(2); Wire.onRequest(requestEvent); }
void loop() { delay(100); }
void requestEvent() { Wire.write("accendi"); }
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 16988
Don't know what I do
|
 |
« Reply #8 on: February 16, 2013, 12:19:17 pm » |
char A = Wire.read(); Serial.print(A); E' sbagliato. Intanto devi usare un tipo "byte" e poi in quel modo leggi solo 1 carattere alla volta. nid69 ti aveva spiega come fare. per poter usare un comando tipo "Accendi" devi leggere un tot di caratteri dal Wire e metterli in un vettore di char (char vet[10]; esempio) oppure in un oggetto String (esempio String str;)
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« Reply #9 on: February 16, 2013, 01:08:28 pm » |
hahahahaha si si non metto in dubbio che me lo abbia spiegato, ma... non so come fare! hehehehehe il libro certe cose non le spiega... cioè la mia domanda è come fare a racchiudere i caratteri dentro un vettore di char, e poi in seguito a richiamarlo con un if per accendere il led??? oppure, come faccio a racchiuderli in un oggetto string che poi racchiuderò nell'if? potete farmi un esempio di codice? 
|
|
|
|
« Last Edit: February 16, 2013, 02:53:58 pm by matt-korban »
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« Reply #10 on: February 16, 2013, 05:00:00 pm » |
ragazzi è ufficiale!!! io ci ho provato in tutti i modi... e NON CI RIESCO.  vi prego aiutatemi sono in panico...  cioè scrivetemi il codice se potete, sarò anche scemo ma così almeno capisco dove sbaglio... ecco come sto provando in 157 modi diversi senza un briciolo di risultato...  #include <Wire.h> char Str2[8]="accendi";
void setup() { Wire.begin(); Serial.begin(9600); pinMode(13, OUTPUT); }
void loop() { Wire.requestFrom(2, 8);
while(Wire.available()) { char Str1[Wire.read()]; Serial.print(Str1); if(Str1==Str2){ digitalWrite(13, HIGH); } delay(500); } }
|
|
|
|
|
Logged
|
|
|
|
|
ivrea (to)
Offline
God Member
Karma: 15
Posts: 911
|
 |
« Reply #11 on: February 16, 2013, 05:38:18 pm » |
void loop() { char vcBuf[10]; // vettore di 10 caratteri (buffer) int idx; // una variabile che conta quanti caratteri abbiamo inserito nel vettore char c; Wire.requestFrom(2, 8); idx=0; while(Wire.available()) { c=Wire.read() // leggo un carattere Serial.print(c); vcBuf[idx]=c; idx=idx+1; // o anche i++; if(idx>=10) idx=0; // se vado oltre al buffer, riparto a riempire il buffer dall'inizio if(strcmp(vcBuf,"Accendi")==0) // confronto vettori di caratteri usando funzione strcmp che internamente controlla char x char { digitalWrite(13, HIGH); } delay(500); } }
|
|
|
|
|
Logged
|
|
|
|
|
ivrea (to)
Offline
God Member
Karma: 15
Posts: 911
|
 |
« Reply #12 on: February 16, 2013, 05:52:13 pm » |
void loop() { String strBuf; int idx; // una variabile che conta quanti caratteri abbiamo letto char c; Wire.requestFrom(2, 8); idx=0; while(Wire.available()) { c=Wire.read(); idx=idx+1; // o anche i++; Serial.print(c); strBuf = strBuf + String(c); //concatena le due stringhe if(strBuf.compareTo("Accendi")==0) { digitalWrite(13, HIGH); strBuf=""; // non so se funziona questo. Intendo svuotare la stringa. idx=0; } if(idx>=10) { idx=0; // se leggi oltre 10 char azzera str strBuf=""; } delay(500); } }
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 87
Posts: 8493
:(){:|:&};:
|
 |
« Reply #13 on: February 17, 2013, 12:53:44 pm » |
ok... infatti per ora ho usato solo caratteri e funziona bene... vorrei però poter usare delle stringhe o dei cluster di char... ma la differenza quale sarebbe???? cioè un insieme di char (caratteri) viene chiamato cluster ma è sempre un insieme di caratteri? mentre una stringa è una parola intera o un numero con più cifre? ora sto provando sia con la funzione string, che con il vettore di char... se avete altri consigli mi fate sapere??? grazie  cluser? intendi dire array forse... bhe allora l'arry di char è la versione "grezza" del C, detta string con la s minuscola, la String invece è una classe, quindi arriva dal C++, ed è una string con in più delle funzioni per semplificare la vita aiprincipianti e far perdere meno tempo a scrivere sempre gli stessi pezzi di codice ai più esperti
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Newbie
Karma: 0
Posts: 49
Arduino rocks
|
 |
« Reply #14 on: February 17, 2013, 05:11:09 pm » |
si scusa, volevo dire array... intanto vi ringrazio per la vostra disponibilità... sopratutto nid69ita per il codice postato... allora, mettendo insieme i vari pezzi e consigli che mi avete dato, sono giunto a questo codice, dove praticamente posso sia accendere e spegnere il led tramite i comandi "accendi" o "spegni".... l'unico problema è che devo resettare la scheda perchè si accorga del cambio di comando! infatti se cambio il comando senza resettarla non si accorge di niente e lo stato del led non cambia, pur cambiando comando nel serial monitor... sto provando a risolvere... qualche idea? basta resettare la stringa? #include <Wire.h> String stringa;
void setup() { Wire.begin(); Serial.begin(9600); pinMode(13, OUTPUT); }
void loop() { Wire.requestFrom(2, 10); delay(50); while(Wire.available()) { char A = Wire.read(); Serial.print(A); stringa += A; if (stringa=="accendi"){ digitalWrite(13, HIGH); } else if(stringa=="spegni"){ digitalWrite(13, LOW); } } }
|
|
|
|
|
Logged
|
|
|
|
|
|