ciao a tutti, poco tempo fa ho cercato aiuto su come pilotare un videoproiettore tramite seriale con arduino UNO e dopo svariati tentativi ci sono riuscito soprattutto grazie al vostro aiuto.
poi avevo deciso di andare a comprarmi una shield wi-fi per potergli inviare i comandi tramite smartphone android con varie app.
il problema che il negozio le aveva finite cosi mi ha consigliato di comprare un arduino YUN ed io ho abboccato.
ora dopo essermi guardato il getting started mi trovo al punto di partenza e non sò dove andre a sbattere.
vorrei arrivare a fare quello che facevo con l'UNO tramite pc, ma davvero non sò da che parte cominciare.
c'è qulcuno che puo farmi vedere i procedimenti base,librerie da usare, comandi, per realizzare l'applicativo che mi interessa?o vero vorrei fare inviare dielle stringhe sulla seriale ma devo comandare l'arduino o da browser o da telefono in wi-fi.
ho cercato un pò in rete ma non ho trovato niente, forse perchè non è molto che è uscito lo YUN.
so che tanti mi diranno inizia a scrivere qualcosa e poi vediamo di correggerlo ma vi giuro che non ho la minima idea di cosa fare.
per questa domanda mi rispondo da solo,leggendo questo http://arduino.cc/en/Tutorial/Bridge sono riuscito a fare cambiare lo stato dei pin tramite telefono. ora come faccio a dirgli che se il un pin (esempio il 10) va in HIGH deve mandare una volta una stringa sulla seriale impostata su 7 e 8?
vi inserisco il pezzo di codice per la stampa sulla seriale
if (digitalRead(10) == HIGH)
{
Serial.println("Led acceso");
mySerial.println("7E 30 30 30 30 20 31 0D");
}
else
{
digitalRead(10==LOW);
Serial.println("Led spento");
mySerial.println("7E 30 30 30 30 20 30 0D");
}
cosi funziona ma continua ininterrottamente a inviare la stringa invece io vorrei fargliela inviare solo al cambio di stato del pin solo una volta.
Premesso che c'è un errore di sintassi ...
digitalRead(10==LOW);
... che non ha molto senso (immagino tu volessi fare un else if), e che devi correggere, comunque, se usi una variabile per salvare lo stato del pin prima del messaggio ed esegui quanto hai scritto solo quando il nuovo stato è diverso dal vecchio stato (ricordandoti di salvare in vecchio stato, lo stato cambiato), ecco che hai fatto un meccanismo che viene eseguito solo al cambio di stato.
Ovvero se vecchio_stato == stato_attuale .. non esegui nulla, se invece è diverso, esegui il tuo if e salvi il nuovo valore in vecchio_stato.
Spero di essere riuscito a spiegarmi ....
Guglielmo
ni non ti seguo molto, è che con arduino avevo fatto qualcosina circa un anno fa ed ora che l'ho ripreso in mano ,non mi ricordo più nulla ,di quel poco che avevo capito.chiedo troppo a farmi un esempio pratico?
P.s.: scusa ma non riesco propio a capire mi dispiace,ho letto e riletto ma mi sembra una "super cazzola" in stile amici miei =( =(.
perdonami non è colpa tua sono io che mi perdo nei passaggi
La funzione digitalRead la stai usando in modo errato:
digitalRead(10==LOW);
E' sbagliato perché la digitalRead, come si evince dal nome, serve per leggere lo stato del pin passato come argomento:
digitalRead(numero_pin);
Ma tu stai facendo un confronto:
10==LOW
che si usa di solito in un if.
Quindi la domanda di Guglielmo era:
vuoi assegnare lo stato logico LOW al pin 10 oppure vuoi leggere lo stato logico del pin 10?
Nel primo caso si usa digitalWrite:
digitalWrite(10, LOW);
Nel secondo si usa digitalRead assegnando il valore ad una variabile.
byte lettura = digitalRead(10);
Allora Micky,
due problemi separati ...
Il primo, come ti ha spiegato Leo, hai sbagliato la sintassi nel tuo codice, quindi vedi bene quello che vuoi fare ...
Il secondo è che tu vuoi eseguire un qualche cosa SOLO una volta al cambio di stato di un pin.
Questa cosa si risolve con l'aiuto di una variabile in cui si memorizza uno stato e, ogni volta che si legge un pin, si verifica se lo stato è sempre quello o se è cambiato. Se è sempre quello non devi fare nulla, se è cambiato, fai quello che devi fare e salvi lo stato cambiato del pin come nuovo stato e .... il ciclo si ripete.
Più chiaro adesso ? Sempre dubbi ?
Guglielmo
grazie a tutti e due, e per Guglielmo guarda che prima non volevo offendere, lo dico prima che qualcuno pensi male, volevo fare una risata ;).
ora è chiaro quello che dovrei fare il problema sarà realizzarlo.
adesso provo a sbatterci un pò la testa ,ma non ti sicuro niente.
micky861:
grazie a tutti e due, e per Guglielmo guarda che prima non volevo offendere, lo dico prima che qualcuno pensi male, volevo fare una risata ;).
...
Tranquillo ... non mi offendo così facilmente, anzi ... tutt'altro
Se ti è tutto chiaro, comincia a buttare giù un programmino e poi, se hai difficoltà, lo metti qui e lo rivediamo tutti assieme
Guglielmo
mi devi scusare ma mi sono spiegato male. tu giustamente mi hai detto che dovrei eseguire un qualche cosa SOLO una volta al cambio di stato di un pin.
però non dovrei fare propio cosi.
dovrei fare
1:accendo arduino e pin si trova in LOW
2:tramite telefono(WIFI) porto pin in High--->arduino invia comando ON alla seriale (solo una volta altrimenti il proiettore va in stallo)
3:arduino ripete il loop e se pin è ancora high ---->non fa nulla
4:ripete il loop e se (tramite telefono)ho portato pin in low -----> arduno invia il comando OFF alla seriale (solo una volta altrimenti il proiettore va in stallo)
4 loop ecc....
forse cosi è più chiaro?
ok ho scritto questo utilizzando Arduino UNO (adibito a muletto) dopo lo darò in pasto a YUN e per alleggerire il codice non ho messo nessuna parte del wifi ecc..ho messo solo la parte della seriale per incomiciare ma "ovviamente" non funziona.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7,8);
byte stato = digitalRead (10);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(10,INPUT);
}
void loop() {
if (stato == LOW); // contolla se pin è low
Serial.println("VPR spento");
if (digitalRead(10) != stato) // controlla se pin è passato in high
{
Serial.println("VPR acceso");
mySerial.println("7E 30 30 30 30 20 31 0D");// invia comando ON al VPR
digitalWrite(stato,HIGH);
}
if (digitalRead(10) == HIGH); //controlla se pin è high
Serial.println("VPR acceso");
{
if (digitalRead(10) != stato) // controlla se pin è passato in low
Serial.println("VPR spento");
mySerial.println("7E 30 30 30 30 20 31 0D");// invia comando ON al VPR
digitalWrite(stato,LOW);
}
}
Scrivi male i ;
Quindi il compilatore interpreta il codice non secondo quello che pensi tu ma secondo le sue regole.
Se metti il ; alla fine dell'IF il comando IF risulta vuoto.
Esempio
if (monete > 10) serial.print("sono ricco!");
Se monete è maggiore di 10 stampa sono ricco.
Se scrivo
if (monete > 10)
serial.print("sono ricco!");
con il comando a capo ma senza ; dopo l'if, il codice è identico al primo
Ma se scrivo
if (monete > 10); serial.print("sono ricco!");
o per capirsi meglio
if (monete > 10);
serial.print("sono ricco!");
Se monete è maggiore di dieci esegue ; (in questo caso non esegue nulla)
Poi passa al comando successivo e stampa "sono ricco!"
Quindi stamperà sono ricco anche se monete è minore di dieci.
Nel tuo codice fai lo stesso errore.
EDIT:
Un consiglio: assegna ad una variabile lo stato del pulsante in modo che questo non vari durante l'esecuzione del programma almeno che non sia una cosa voluta.
Potresti avere una transizione di stato durante il ciclo loop() e siccome hai 3 letture potresti ottenere risultati inattesi.
ho sistemato i ; come mi hai detto ma ancora non funziona.ho anche provato per la prima volta a disegnare un flusso logico ma con scarsi risultati e forse il mio problema è propio questo.probabilmente è meglio se faccio un passo indietro ed incominciare a stendere propio il diagramma logico,il problema è che non ne ho mai fatto uno e lo trovo particolarmente difficile.potete prima aiutrmi su questo problema o indicarmi un tutorial guida su come fare?
micky861:
.... probabilmente è meglio se faccio un passo indietro ...
Non ti offendere ... ma un passetto indietro doversti farlo anche per quello che riguarda il C e l'utilizzo delle funzioni di Arduino ...
Ad esempio stai usando in modo completamente errato la :
digitalWrite(stato,LOW);
... difatti quella funzione vuole in numero del piedino ed il valore che deve assumere, mentre tu ... come numero di piedino gli stai passando la variabile "stato" che vale HIGH o LOW.
Non solo scrivi :
byte stato = digitalRead (10);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(10,INPUT);
}
Ovvero fai una digitalRead su un piedino ... prima ancora di averlo dichiarato come input .. difatti il pinMode lo fai dopo, nel setup().
Più corretto sarebbe stato :
byte stato;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(10,INPUT);
stato = digitalRead(10);
}
e così via ...
Insomma ... un bel ripasso di C e del Reference probabilmente sarebbe necessario
Guglielmo
Non ti offendere ... ma un passetto indietro doversti farlo anche per quello che riguarda il C e l'utilizzo delle funzioni di Arduino .
di offesa neanche si parla , ogni vostra parola è oro colato per me,sono pienamente consapevole di avere carenze alla base, il fatto è che ho vouto fare il passo più lungo della gamba, anche se io sono dell'idea che "tentar non nuoce".ovviamente non posso prendermi in giro da solo, se una cosa non la sai, non la sai e basta.
adesso vedrò di farmi un minimo di cultura in C e poi vediam.
intanto vi rigrazio tutti per la pazienza che avete portato e vi dico a-risentirci presto.
Grazie
micky861:
intanto vi rigrazio tutti per la pazienza che avete portato e vi dico a-risentirci presto.
Noi siamo qui e ... ti aspettiamo
Guglielmo