Show Posts
Pages: 1 ... 5 6 [7] 8 9 ... 26
91  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: February 08, 2014, 02:07:25 pm
Ciao Michele,
hai la procedura che comanda le pompe?

92  International / Generale / Re: Lettura Tasti con PCF8574 on: February 08, 2014, 02:06:18 pm
Ciao a tutti,
grazie anche al contributo del buon Leouz, sono arrivato ad una versione dello sketch più stabile, la metto in allegato.
Cosa ne pensate?

Code:
#include <Wire.h>

#define buzzer 14
#define keyboard 0x39 //PCF8574AP A0 VCC A1,A2 GND

byte appoggio,tasto;
volatile boolean counter = false;
boolean rstpcf;
const byte sx = 193;
const byte dx = 194;
const byte dec = 196;
const byte inc = 200;
const byte ok = 208;
const byte esc = 224;
const byte Null = 192;
unsigned long oldtasto;

void statotasto()
{ counter = !counter;
}

byte read_pcf(int indirizzo)
{ byte statoIOpcf;
Wire.beginTransmission(indirizzo); // prima lettura per resettare il pcf ed attivare il piedino int
Wire.requestFrom(indirizzo, 1);
if(Wire.available())
statoIOpcf = Wire.read();
Wire.endTransmission();
return statoIOpcf;
}

void leggitasto()
{ if (counter)
{ if (millis() - oldtasto >= 250)
{ appoggio = read_pcf(keyboard);
rstpcf = true;
switch (appoggio)
{ case sx:
Cicalino(240);
tasto = appoggio;
break;

case dx:
Cicalino(240);
tasto = appoggio;
break;

case dec:
Cicalino(220);
tasto = appoggio;
break;

case inc:
Cicalino(220);
tasto = appoggio;
break;

case ok:
Cicalino(200);
tasto = appoggio;
break;

case esc:
Cicalino(180);
tasto = appoggio;
break;

default:
counter = false;
read_pcf(keyboard);
tasto = 0;
rstpcf = false;
break;
}
oldtasto = millis();
}
}
else { 
if (rstpcf)
{ read_pcf(keyboard);
tasto = 0;
counter = false;
rstpcf = false;
}
}

}

void Cicalino (byte tono)
{ for (int i = 0; i < 90; i++)
{ digitalWrite(buzzer,HIGH);
delayMicroseconds(tono);
digitalWrite(buzzer,LOW);
delayMicroseconds(tono);
}
}

void setup()
{ Wire.begin();
Serial.begin(9600);

pinMode(buzzer, OUTPUT);

read_pcf(keyboard);

attachInterrupt(0, statotasto, FALLING);

}

void loop()
{ leggitasto();

}

Ciao Riccardo.
93  International / Generale / Re: Lettura Tasti con PCF8574 on: February 05, 2014, 02:33:04 pm
Ciao a tutti,
chiedo scusa, ma mi sono accorto che lo sketch non funziona bene, soprattutto se integrato in sketch più grandi tipo quello del mio controller, di seguito metto lo sketch ulteriormente rielaborato:
Code:
#include <Wire.h>

#define buzzer 14
#define keyboard 0x39 //PCF8574AP A0 VCC A1,A2 GND


const byte sx = 193;
const byte dx = 194;
const byte dec = 196;
const byte inc = 200;
const byte ok = 208;
const byte esc = 224;

unsigned long oldtasto;
byte tasto;
volatile byte counter = 0;
boolean rstpcf;

void readpcf()
{ Wire.beginTransmission(keyboard); // prima lettura per resettare il pcf ed attivare il piedino int
Wire.requestFrom(keyboard, 1);
if(Wire.available())
tasto = Wire.read();
Wire.endTransmission();
}

void statotasto()
{ counter++;
}

void leggitasto()
{ if (counter == 1)
{ if ((millis() - oldtasto >= 300) || (millis() - oldtasto >= 10) && tasto == 0)
{ readpcf();
rstpcf = true;
Serial.print("Tasto usatoo: ");
switch (tasto)
{ case sx:
Cicalino(240);
Serial.println("SX");
break;

case dx:
Cicalino(240);
Serial.println("DX");
break;

case dec:
Cicalino(220);
Serial.println("DEC");
break;

case inc:
Cicalino(220);
Serial.println("INC");
break;

case ok:
Cicalino(200);
Serial.println("OK");
break;

case esc:
Cicalino(180);
Serial.println("ESC");
break;
}
oldtasto = millis();
}
}

else {
if (rstpcf==true)
{ counter = 0;
readpcf();
tasto=0;
Serial.print("Tasto usato: "); Serial.println(tasto);
rstpcf = false;
}
}

}

void Cicalino (byte tono)
{ for (int i = 0; i < 90; i++)
{ digitalWrite(buzzer,HIGH);
delayMicroseconds(tono);
digitalWrite(buzzer,LOW);
delayMicroseconds(tono);
}
}

void setup()
{ Wire.begin();
Serial.begin(9600);

pinMode(buzzer, OUTPUT);

readpcf();

attachInterrupt(0, statotasto, FALLING);

}

void loop()
{ leggitasto();

}

e qui quello che succede nel seriale:

Code:
Tasto usatoo: INC
Tasto usato: 0
Tasto usatoo: INC
Tasto usatoo: INC
Tasto usatoo: INC
Tasto usatoo: INC
Tasto usato: 0
Tasto usatoo: SX
Tasto usatoo: SX
Tasto usato: 0
Tasto usatoo: SX
Tasto usato: 0
Tasto usatoo: ESC
Tasto usato: 0
Tasto usatoo: ESC
Tasto usato: 0
Tasto usatoo: ESC
Tasto usatoo: ESC
Tasto usatoo: ESC
Tasto usato: 0
Tasto usatoo: DX
Tasto usato: 0
Tasto usatoo: DX
Tasto usato: 0
Tasto usatoo: DX
Tasto usatoo: DX
Tasto usato: 0
Tasto usatoo: OK
Tasto usato: 0
Tasto usatoo: OK
Tasto usato: 0
Tasto usatoo: OK
Tasto usatoo: OK
Tasto usatoo: OK
Tasto usatoo: OK
Tasto usato: 0
Tasto usatoo: ESC
Tasto usato: 0

In pratica se premo i tasti “normalmente” tutto funziona apparentemente a dovere, singola pressione e pressione mantenuta va tutto benne, ma se premo velocemente i tasti ecco che, perdo il controllo dell’INT del PCF e/o della variabile counter, poi a volte continuando a premere la situazione si normalizza di nuovo, altre la lettura tasti smette di funzionare completamente ovvero INT va fuori controllo credo alto e la ISR non funziona più., ecco il seriale

Code:
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0

Notate che quando scrive usatoo con due è rimane dentro la if dei,
quando scrive usato con una o sola è dentro l’else.
A pagina 9 di questo link:
http://www.ti.com/lit/an/scpa032/scpa032.pdf
C’è qualcosa sull’INT del PCF che non riesco a tradurre, forse qualcuno di voi riesce a farmi capire qualcosa…

Grazie in anticipo per il tempo che vorrete dedicarmi.
94  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 12:57:22 pm
Ciao e scusa,
il 7 è un mio errore di battitura, la sigla giusta è PCF8574 o PCF8574A.

Riccardo
95  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 08:17:19 am
Ho aggiornato scheda e pcb, seguendo il consiglio di Etemenanki...
Metto in allegato quì e sul primo post.

Ancora grazie a tutti.
96  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 05:56:14 am
@ leo72
Figurati no problem...

@ Etemenanki
Grazie ancora!!!
97  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 05:45:46 am
@Etemenanki
Grazie per il tempo che mi stai dedicando...  smiley
ti scrivo come ho ragionato, ma ricorda che sono un autodidatta, quindi ti prego non scatenare una delle tue guerre termonucleari  smiley-razz ...
1. Leggo i tasti con il pcf, quindi l'isteresi di arduino di cui avevo letto qualche tempo fa anche io non l'ho considerata
2. Ho pensato che i rimbalzi dei tasti potessero a lungo andare o generare errori di lettura del pcf stesso o comunque danneggiarlo in qualche modo
3. Nei miei esperimenti iniziali proprio il bouncing mi ha dato più di un grattacapo (leggi tastini o bread di scarsa qualità o mia incapacità stessa), il tarlo/ansia del debouncing ormai mi accompagna, ma ho cercato cmq una soluzione relativamente semplice.
4. Ho voluto usare la porta logica proprio per mandare al PCF uno stato logico pulito e blindarne la lettura, poi l'SN74HC14 costa veramente una sciocchezza.
5. Ho visto anche io soluzioni in cui si usano gli zener, ma proprio per avere un circuito un pochino più semplice li ho evitati, leggendoti poi in relazione alla lunghezza dei cavi, se guardi il pcb il problema non lo ho quindi preferisco non metterli ma implementare la resistenza che mi hai suggerito.
Grazie ancora.

@leo72
Grazie, ho imparato un'altra cosa anche io.

Ciao Riccardo.

Ciao Riccardo.
98  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 04:09:12 am
Ciao Etemenanki,
grazie, mi stai suggerendo quindi un circuito come quello in allegato?

Ciao Riccardo.
99  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 03:41:20 am
1. Ho visto che esegui un blocco di codice solo se la pressione del pulsante è avvenuta a più di 200 ms dalla precedente. E' una specie di debounce, per evitare che l'utente si diverta a pigiare sui pulsantini magari 2 volte, o mi sbaglio?
Comunque, tu fai un'assegnazione a oldtasto del valore di millis, poi esegui tutta la pappardella del blocco di codice. Se la metti in fondo al blocco, quell'assegnazione, in questo modo la prox volta il controllo viene eseguito su 200 ms dal termine del blocco di codice. Consideri, cioè, una specie di "comporto" tutto qui  smiley-wink

2. if (counter) equivale ad un if(counter>=1) oppure a if(counter!=0).
Non vedo perché non debba funzionare, a meno che non abbia tralasciato qualche altra porzione del tuo codice che fa qualcos'altro.

Ciao Leo,
ora ho compreso la parte 1 ed ho modificato lo sketch.
Per la parte 2, non ho tralasciato nessuna parte di codice.
Provo a spiegare cosa succede nello sketch:
1. premo il tasto e la ISR statotasto() incrementa counter a 1
2. leggitasto verifica counter ed esegue la lettura del pcf, qui di fatto può effettivamente valere solo la condizione if (counter == 1) ciò è dovuto al fatto che la ISR si riattiva anche se rilascio a causa del fatto che INT del PCF si disattiva e dopo una lettura torna basso ed ecco quindi che la condizione if (counter) equivale ad un if(counter>=1) oppure a if(counter!=0) mi fa rientrare nella lettura effettiva del tasto e non reset del PCF che di fatto esegue si una lettura ma ha lo scopo di riattivare appunto l'INT del PCF, non o se sono riuscito a farmi capire, ma di fatto è ciò che succede.
3. rilascio il tasto INT del PCF va basso per il motivo di cui sopra, la ISR statotasto incrementa nuovamente counter che diventa 2 ed attiva l'else in cui resetto il pcf con una lettura a vuoto ed azzero la variabile tasto.

Complimenti e grazie per la condivisione.
Una cosa pero'
Nel titolo citi pcf8574 ma nel post PCF8774AP, quale usi?

Hai ragione, in effetti esistono due versioni di questo expander: PCF8574 e PCF8574A, i miei hanno anche una P finale ma non so cosa significhi.
Di fatto in ogni caso le differenza tra le due versioni è unicamente nell'indirizzamento degli IC, in allegato ti ho messo delle immagini che spero spieghino quello che ho appena scritto  smiley-wink

Ciao Riccardo.

P.S. In allegato anche il codice corretto con il suggerimento di Leo sulla variabile oldtasto.

100  International / Generale / Re: Lettura Tasti con PCF8574 on: January 31, 2014, 02:19:05 pm
Intanto mi segno e ti faccio i complimenti per la realizzazione.
Nel fine settimana leggo tutto con calma.

Grazie Paolo, aspetto le tue conclusioni  smiley

Complimenti!  smiley

Grazie, ma non è che abbia fatto poi chissa cosa, ho voluto però condividere per i principianti come me..

Complimenti per il progettino.
Due suggerimenti, sono sciocchezze, ma mi preme dirle perché poi te le ritrovi anche in altri progetti  smiley-wink
1. Quando nei casi in cui usi millis per il debounce, io suggerisco di fare l'assegnazione alla variabile che contiene il momento dell'attivazione all'uscita del blocco di codice.
Tu fai un oldtasto = millis() prima di eseguire diverse cose che ti portano via del tempo, comprese accesi sul bus I2C e scritture seriali. Perdi poco, ma quel poco in caso di un intoppo potrebbe diventare molto. E sfalsarti il dato.

2. Fai un controllo if (counter == 1) per controllare se è stato premuto un tasto, ma c'è la possibilità che counter possa diventare maggiore di 1?
Per evitare questi dubbi, farei un controllo generico sul fatto che counter sia 0 o maggiore, quindi metterei un semplice if(counter), che risulta vero in tutti i casi in cui counter abbia un valore diverso da 0.

Grazie Leo, ma perdonami se non ho capito bene cosa vuoi dirmi...
1. Non ho usato millis per fare il debounce, di fatto è proprio quello che ho cercato di evitare complicando, ma nemmeno poi tanto, la parte hardware, in realtà oldtasto lo uso per fare un timing sulla ripetizione del valore del tasto nel caso lo si tenga premuto, appena lascio tasto torna=0.
2. Appena ti ho letto, ho subito pensato che era così, ma appena ho provato, leggitasto() ha smesso di funzionare, ma non ho capito perché...  smiley-red

Ciao Riccardo.
101  International / Generale / Lettura Tasti con PCF8574 on: January 31, 2014, 12:55:53 pm
Ciao a tutti,  smiley
purtroppo, con il mio progetto, per motivi vari sono un po’ fermo, così mi concentro un po’ sulle ottimizzazioni…
Una cosa che volevo fare da tempo, era migliorare la lettura dei tasti: attualmente, nel mio sketch, vengono letti utilizzando la libreria IOexp che interroga a ripetizione il PCF8774AP a cui sono collegati i tasti sperando che prima o poi venga premuto un tasto, di fatto il bus I2C è perennemente spazzolato inutilmente e questo non mi piaceva affatto…
L’obiettivo quindi era interrogare il PCF incriminato solo se effettivamente premo un tasto ed ho avuto il compito facilitato dal PCF stesso che ha un bel piedino INT open drain, ovvero attivo quando è basso (ha bisogno di una R di pull up da 4K7).
Mi ha un po’ messo in difficoltà perché a causa di un’errata traduzione del datasheet, non avevo capito che ad ogni lettura l’INT si disabilita, poi però è andato tutto bene, in allegato c’è lo sketch (che poi implementerò in quello del controller), nel quale è incluso anche l’utilizzo di un buzzer per avere un feedback sonoro quando viene premuto un tasto.
Non contento del lavoro fatto, mi sono dedicato sul lato hardware al debouncing dei tasti, attualmente, sempre nel mio progetto, uso un semplice circuito basato su RC, ma non ero soddisfatto, così ho voluto migliorare anche questa parte; ho fatto un po’ di ricerche ed alla fine ho scelto di realizzare quello che ho trovato a questo link: http://www.ikalogic.com/de-bouncing-circuits/
Fatte un po’ di prove su breadboard, ho disegnato il circuitino ed il PCB in allegato che poi diventerà il modulo tasti del mio progetto. Non sono ancora però sicuro di aver fatto un buon lavoro, così eccomi a chiedervi cosa ne pensate.  smiley-red
Grazie in anticipo per il tempo che vorrete dedicarmi.

Documentazione:
http://www.ti.com/lit/ds/symlink/pcf8574a.pdf
http://www.settorezero.com/wordpress/utilizzare-l-io-expander-pcf8574/
http://www.ti.com/lit/ml/scyb031/scyb031.pdf
http://www.ikalogic.com/de-bouncing-circuits/

P.S. Ho postato in “Generale” generale perché tratto sia di hardware che di software e non nel topic del mio progetto, perché ho pensato che l’input con i tasti così come l’ho realizzato può tornare utile in altre applicazioni, spero di aver fatto la cosa giusta.


102  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: January 18, 2014, 02:02:16 pm
Ciao Michele,
perdonami ma no ti capisco, cosa intendi per

ma non riesco a capire dove e come inserire ImpostaDosatore

Se intendi la funzione/procedura la puoi mettere ovunque purché al di fuori del setup e del loop. poi la richiami nel loop dove ti serve, di più non so cosa dirti.
Mi pare di capire poi che userai una seconda scheda relè giusto? non so come funziona un dosatore, ma sono un pò perplesso...
poi che senso ha modificare tutto lo scketch principale se ti manca ancora la procedura/funzione che pilota i dosatori e la procedura/funzione che acquisisce i dati di funzionamento dei dosatori, diciamo che quest'ultima la puoi non fare se inserisci dati direttamente nello sketch, rimane scomodo pero questo caso perché ogni volta che vuoi aggiornare i dati in questione devi riflashare Arduino.
In pratica ti ridò il consiglio che ti ho dato inizialmente, non partire dalla fine, scrivi prima cio che ti serve per far funzionare i dosatori quando avrai qualcosa di funzionante modifichi lo sketch principale per inserire ciò che hai fatto.
Ciao e buon fine settimana  smiley
103  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: January 18, 2014, 01:11:31 pm
Si si , lo avevo capito questo, me lo guardo bene, ma sono ormai abbastanza avanti col mio progetto, però magari ti rubo qualche idea...  smiley-mr-green smiley-mr-green smiley-mr-green
Rimane il fatto che sono colpito dalla tua competenza in campo elttronico, sembra quasi che la respiri ti invidio un pochino...
104  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: January 18, 2014, 11:45:58 am
Ciao elleffe,

Chiedo anche se è possibile usare l’Arduino Mega invece che l’Arduino Uno.

Si è possibile devi solo combiare i pin di SDA e SCL che sulla UNO corrispondono ai pin A4 e A5, mentre sulla mega corrispondono ai pin 20 e 21, naturalmente poi devi compilare per la mega, non credo che serva latro, magari se qualche guru ti legge ti saprà dire meglio.

Ho potuto leggere tutte le pagine di questo progetto e se mi è permesso vorrei capire il perché è stato pensato di usare quel sistema di controllo livelli, non era più semplice mettere un sensore di massima e uno di minima per eseguire i rabbocchi?

Con il tuo sistema hai un unico rabbocco fisso, e se vuoi cambiare, devi regolare fisicamente i sensori in vasca, con il ns sistema invece hai lettura in continuo del livello dell'acqua qualunque esso sia, quindi si può usare come osmo regolatore, o per programmare cambi di diverse quantità schedulando nel tempo parziali giornalieri o settimanali cambiando a piacimento via software le quantità d'acqua e tutto con un unico sensore...

La mia non vuole assolutamente essere una critica, ma visto che il progetto è ancora in fase di collaudo fate le giuste scelte.

Ogni critica o suggerimento, sono sempre bene accetti, quindi non farti scrupoli se ti viene in mente altro  smiley


Accipicchia Etemenanki questo mi era sfuggito, vedo di guardarmelo bene bene, grazie infinite per averlo condiviso.  smiley-grin

Riccardo.

105  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: January 13, 2014, 05:36:27 am
Ciao Michele,
scusa se ci metto tanto a rispondere, ma il tempo è sempre scarsissimo, iniziamo:
se vai a riga 1092 dello sketch, trovi un esempio di menù, come vedi si tratta di dichiarare un array di stringhe, dove la prima voce (blocco 0 dell’array) è l’intestazione del menù stesso, nonché l’intestazione della schermata dove scorre il menù, a seguire poi tutte le voci che ti servono per quel menù, ad esempio:

Code:
char* VociMenuDosatori[] ={"    IMP. DOSATORI",       // Intestazione e voci del menu luci
"Dosatore 1 ",
" Dosatore 2 ",
" Dosatore 3 ",
" Dosatore 4",
};

Quando richiami la funzione del menù, devi passare nell’esatto ordine questi parametri:
  • variabile che conterrà il valore scelto nel menù
  • numero delle voci del menù
  • il vettore di strighe che hai creato
In questo modo:

Code:
Scorrimenu (MenuDosatori, 4, VociMenuDosatori);

Ma lo devi fare nel loop all’interno di una struttura switch case:
Code:
switch (MenuDosatori)
{ case 0:
Scorrimenu (MenuDosatori, 4, VociMenuDosatori);
break;

case 1:
ImpostaDosatore (dosatore1);
break;

case 2:
ImpostaDosatore (dosatore2);
break;

case 3:
ImpostaDosatore (dosatore3); 
break;

case 4:
ImpostaDosatore (dosatore4);
break;
}

E’  importante che sia la variabile "MenuDosatori" che quella "Avvio" siano inizializzate a 0, la prima perché altrimenti non entri nello switch case, la seconda perché fa eseguire all’interno della funzione “Scorrimenu” la prima if, che è quella che popola il display la prima volta.
Nel display vedrai nella prima riga l’intestazione della schermata e poi le voci che scorrono quando premi i tasti su o giù, quando premi ok, “Scorrimenu” assegna alla variabile “MenuDosatori” il  valore che stai puntando ed automaticamente viene eseguito il codice all’interno di quel case.
Va da se che poi la procedura o funzione ImpostaDosatore(); te la devi creare da solo.
Spero di esserti stato utile.
Ciao.
Pages: 1 ... 5 6 [7] 8 9 ... 26