Salve ragazzi,
sono alle prese con un problema: uno script Python manda dei dati attraverso l'interfaccia seriale di Arduino.
Questi dati devono essere trattati separatamente, alcuni servono a far attivare/disattivare un LED, altri devono essere visualizzati su schermo LCD.
Sto provando a realizzare lo sketch ma non va, potreste gentilmente aiutarmi?
Eccovi il codice:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
char parola[6];
int numero[6];
char index[5]="pnec";
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0,1);
}
void loop() {
if (Serial.available()){
char comp=Serial.read();
if (comp==index[0]){
for(int i=0; i<7; i++){
parola[i]=Serial.read();}}
if (comp==index[1]){
for(int j=0; j<7;j++){
numero[j]=Serial.read();}}
if (comp==index[2]){
Serial.print(parola);
lcd.print(numero[4]);
}
if (comp==index[3]){
lcd.clear();
}
}}
Per adesso ho mandati delle stringhe di prova tramite monitor seriale tipo:
pmamma
n12345
e
Ma nulla, dove sbaglio?
perche non fai un passettino alla volta?
fagli leggere come primo passo, una sola stringa (che siano numeri o parle non importa) e rimandala sulla seriale.
poi se vuoi mettere più cose mi sa che devi implementare un piccolo protocollo di comunicazione, ma questo è il secondo passo, all'inizio accontentati di una sola stringa
non son un espertissimo di software ma dubito d sarà mai verò:
if (comp==index[0]){
for(int i=0; i<7; i++){
questo esempio è qualcosa di estremamente basico, ma credo utile per iniziare:
void setup() {
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
int pippo = 0;
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
pippo = Serial.read();
// Serial.println (pippo);
if (pippo == 'a') {Serial.println ("Attivo Led 1");digitalWrite (11, HIGH);}
if (pippo == 'b') {Serial.println ("Disattivo Led 1");digitalWrite (11, LOW);}
if (pippo == 'c') {Serial.println ("Attivo Led 2");digitalWrite (10, HIGH);}
if (pippo == 'd') {Serial.println ("Disattivo Led 2");digitalWrite (10, LOW);}
}
}
poi se hai bisogno di esempi anche piu complessi di comunicazione tra (QT)python e arduino, ne ho di pronti e funzionanti
Grazie Martinix,
ci lavoro su!
con questo a suo tempo avevo cominciato a capire il funzionamento..poi tutto diventa chiaro
e ovviamente puoi complicarlo all'infinito!!
il programmino di cui sopra accetta SOLO singoli caratteri a , b, c.....
il prssimo passo saranno le frasi
Al codice da te postato ho dichiarato un array di 4 elementi e provo a cambiarlo, quando premo il tasto n.
Ma quando dico ad Arduino di mostralo tramite seriale (tasto b), mi da -1-1-1-1.
int numero[4]={1,2,3,4};
void setup() {
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
int pippo = 0;
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
pippo = Serial.read();
// Serial.println (pippo);
if (pippo == 'a') {Serial.println ("Attivo Led 1");digitalWrite (11, HIGH);}
if (pippo == 'b') {Serial.println ("Disattivo Led 1");digitalWrite (11, LOW);
for(int j=0; j<4;j++) {
Serial.print(numero[j]);}
Serial.println();}
if (pippo == 'c') {Serial.println ("Attivo Led 2");digitalWrite (10, HIGH);}
if (pippo == 'd') {Serial.println ("Disattivo Led 2");digitalWrite (10, LOW);}
if (pippo == 'n') {for (int f=0; f<5;f++){numero[f]=Serial.read();}}
}
}
Non riesco a capire, concettualmente, dove sbaglio.
int pippo = 0;
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
pippo = Serial.read();<------ questo diventa un array!!!
se vuoi "riepire" un array devi riempirlo prima ovvero dove ce la "variabile" pippo che deve essere un array!
ovviamente con tutti i cicli for del caso...questo era il passo 2
void setup() {
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
int pippo = 0;
int numero[4];
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
pippo = Serial.read();
// Serial.println (pippo);
if (pippo == 'a') {Serial.println ("Attivo Led 1");digitalWrite (11, HIGH);}
if (pippo == 'b') {Serial.println ("Disattivo Led 1");digitalWrite (11, LOW);
for(int j=0; j<4;j++) {
Serial.print(numero[j]);}
Serial.println();}
if (pippo == 'c') {Serial.println ("Attivo Led 2");digitalWrite (10, HIGH);}
if (pippo == 'd') {Serial.println ("Disattivo Led 2");digitalWrite (10, LOW);}
if (pippo == 'n') {for (int f=0; f<4;f++){numero[f]=Serial.read();}}
}
}
Anche in questo modo non riesco a riempire il vettore numero con 4 cifre che immetto dopo la lettera n.
Forse sarebbe adatto usare in ciclo while, che si interrompe quando immetto una lettera e non un numero, per popolare l'array desiderato?
if si interronpe (false) appena il buffer è vuoto se tu mandi "1234" dopo 4 il buffer è vuoto ed esece dall if ...