Loading...
Pages: [1] 2   Go Down
Author Topic: inviare parole ad Arduino in rete [RISOLTOOOO]  (Read 569 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Tesla Member
***
Karma: 87
Posts: 8493
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

metti il codice che usi smiley
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ivrea (to)
Offline Offline
God Member
*****
Karma: 15
Posts: 911
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/StringComparisonOperators

dal 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 Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ragazzi e grazie! ecco vi posto il codice che ho fatto... sono nuovo in questo mondo quindi capirete gli errori...

Code:
#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 Offline
God Member
*****
Karma: 15
Posts: 911
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vi posto il codice con le modifiche che ho provato a fare...

master reader-----------------------------------------------
Code:
#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-------------------------------------------
Code:
#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 Offline
Brattain Member
*****
Karma: 226
Posts: 16988
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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 Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

 smiley-roll-blue smiley-roll-blue smiley-roll-blue
« Last Edit: February 16, 2013, 02:53:58 pm by matt-korban » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ragazzi è ufficiale!!! io ci ho provato in tutti i modi... e NON CI RIESCO. smiley-eek-blue

vi prego aiutatemi sono in panico... smiley-confuse 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... smiley-sweat smiley-sweat smiley-sweat


Code:
#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 Offline
God Member
*****
Karma: 15
Posts: 911
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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 Offline
God Member
*****
Karma: 15
Posts: 911
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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 Offline
Tesla Member
***
Karma: 87
Posts: 8493
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Newbie
*
Karma: 0
Posts: 49
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

Code:
#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

Pages: [1] 2   Go Up
Print
 
Jump to: