ciao ragazzi sto realizzando un progetto con atmega328 con il boostloader programandolo con arduino il problema teoricamente è semplice devo fare un programma che acquisca dei bit da tastiera in paricolare 4 tasti
appena accendo il sistema su lcd compagliono due scritte: caso1 e caso2 e tramite due bottoni scelgo uno dei due casi appena scelgo uno dei due casi parte un sotto programma
potreste darmi uno pseudocodice oppure un idea ben dettagliata su come realizzarlo?? un mio amico mi ha detto che potrei farlo tramite un vettore di due elementi dove ogni elemento è il percorso di un sotto programma e tramite tasti scelgo gli elementi del vettore ma in pratica non so come farlo
programmare un ATMEGA328P con LCD E TASTIERA
Moderatore:
Paolino
10 messaggi
• Pagina 1 di 1
0
voti
tastiera è troppo generico :) Intendi una tastiera per computer con attacco PS2 o USB oppure una tastiera creata da te con 4 pulsanti?
0
voti
specifico meglio sto ordinando un LCD 1602 shield con 6 pulsanti, visto che sul sito non ci sono le specifiche pero dalle foto si vede che ha 16 piedini dell LCD e 10 per i pulsanti adesso la logica che li governa non la so in quanto ancora non l ho acquistato
-

alessandrofava10
8 3 - Messaggi: 45
- Iscritto il: 6 nov 2014, 21:04
0
voti
per la scelta a video io la farei molto più facile, forse non serve nemmeno un array se devi lavorare con solo due scelta basta una flag booleana.
questa è una soluzione moooolto blanda, gestisce solo due scelte del menu e il tempo non deve essere critico (presenta il debouce con delay in cui il micro è congelato).
una scelta migliore ptrebbe essere gestire i pulsanti con delle interrupt. spero di essere stato utile (e spero di non aver detto baggianate) in ogni caso aspettiamo risposte di utenti più esperti in microcontrollori
- Codice: Seleziona tutto
int menu=0;
void loop{
if(menu) {
lcd.setCursor(0,0);
lcd.print("caso1"); //se menu vale 1 stampo a video caso1
}
if(!menu){
lcd.setCursor(0,0);
lcd.print("caso0"); //se menu vale 0 stampo a video caso0
}
//questo bottone ti fa spostare tra le due voci del menu
if(!digitalRead(__TUO_BUTTON)){
delay(50); //debouce
menu= 1-menu; //se è 1 diventa 0 e viceversa
}
//quando premi il pulsante "ok" che ti fa scegliere distingui i casi...
if(!digitalRead(__ALTRO_BOTTONE)){
delay(50); //debouce
if(menu) sottoProgrammaUno(); //se quando lo premi sei sulla voce 1 del menu lanci il primo sottoprogramma
if(!menu) sottoProgrammaDue(); //senno lanci il secondo
}
}
questa è una soluzione moooolto blanda, gestisce solo due scelte del menu e il tempo non deve essere critico (presenta il debouce con delay in cui il micro è congelato).
una scelta migliore ptrebbe essere gestire i pulsanti con delle interrupt. spero di essere stato utile (e spero di non aver detto baggianate) in ogni caso aspettiamo risposte di utenti più esperti in microcontrollori
0
voti
ops, ci siamo accavallati con le risposte
quell'lcd ha un solo pin che gestisc tutti i pulsanti in quanto li comanda in maniera analogica. nel mio codice di prima bisogna sotituire i digitalRead con analogRead e il valore del pulsante indicato per quella shield :)
quell'lcd ha un solo pin che gestisc tutti i pulsanti in quanto li comanda in maniera analogica. nel mio codice di prima bisogna sotituire i digitalRead con analogRead e il valore del pulsante indicato per quella shield :)
0
voti
ti ringrazio della risposta ma da quanto ho capito il tuo codice utilizza solo due bottoni nel senso con uno scendi e sali tra le due opzioni e il secondo bottone serve per selezionare giusto ?? se non e cosi non sono riuscito ad immaginare cosa vedo su lo schermo
-

alessandrofava10
8 3 - Messaggi: 45
- Iscritto il: 6 nov 2014, 21:04
0
voti
ovviamente il mio non è un codice finito e farebbe rabbrividire qualsiasi microcontrolista qui su EY. Ho buttato giù giusto il "menu", all'accensione hai solo la scritto "caso0"(ovviamente ci scivi quello che vuoi), alla pressione di un pulsante cambia in "caso1", se premi l'altro pulsante invece esegue funzioni diverse in base a se ti trovi su caso0 o 1 tutto qui.
0
voti
quindi la variabile menu non è un pulsante perche io l ho aggiustato in questo modo pero ce qualcosa che non va nell esecuzione del simulatore
- Codice: Seleziona tutto
#include<LiquidCrystal.h>
#include<stdio.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int menu=0;
int bottone1=A2;
int bottone2=A3;
int luminosita;
int umidita;
int pinled=13;
int pinsensoreumi=A1;
int pinsensorelumi=A0;
void setup(){
Serial.begin(9600);
pinMode(pinled,OUTPUT);
pinMode(pinsensorelumi,INPUT);
pinMode(pinsensoreumi,INPUT);
pinMode(bottone1,INPUT);
pinMode(bottone2,INPUT);
lcd.begin(16, 2);}
void loop(){
if(menu) {
lcd.setCursor(0,0);
lcd.print("mod auto"); //se menu vale 1 stampo a video caso1
}
if(!menu){
lcd.setCursor(0,0);
lcd.print("mod temp "); //se menu vale 0 stampo a video caso0
}
//questo bottone ti fa spostare tra le due voci del menu
if(!analogRead(bottone1)){
delay(50); //debouce
if(menu) menu=0;
else menu=1 ;//se è 1 diventa 0 e viceversa
}
//quando premi il pulsante "ok" che ti fa scegliere distingui i casi...
if(!analogRead(bottone2)){
delay(50); //debouce
if(menu) sottoprogramma1(); //se quando lo premi sei sulla voce 1 del menu lanci il primo sottoprogramma
if(!menu){ lcd.clear();
lcd.setCursor(0,0);
lcd.print("hello"); } //senno lanci il secondo
}
}
void sottoprogramma1() {
for(;;) {
umidita=analogRead(pinsensoreumi);
luminosita=analogRead(pinsensorelumi);
lcd.home();
lcd.print("luce: ");
lcd.println(luminosita);
lcd.setCursor(0,1);
lcd.print("umidita: ");
lcd.println(umidita);
lcd.noDisplay();
delay(5);
lcd.clear();
if (luminosita<400) {
if(umidita<500){
digitalWrite(pinled,HIGH);
}
else digitalWrite(pinled,LOW);}
else digitalWrite(pinled,LOW);
}}
-

alessandrofava10
8 3 - Messaggi: 45
- Iscritto il: 6 nov 2014, 21:04
0
voti
problema risolto la simulazione funziona egregiamente pero sono molto ma molto lontano dalla reaalizzazione finale del programma... ultima cosa la delay perche è stata impostata a 50 ??
-

alessandrofava10
8 3 - Messaggi: 45
- Iscritto il: 6 nov 2014, 21:04
0
voti
Non fidarti troppo dei simulatori, la realtà può risultare essere ben diversa. La shield che hai acquistato utilizza un solo pin analogico come uscita per tutti i pulsanti. L analog read su questo pin assumerà valori diversi in base al pulsante premuto quindi il codice è da adattare:
Così quella if verrà eseguita solo se il pin ha valore analogico entro una soglia (che devi trovare sperimentalmente) diversa da pulsante a pulsante.
Per capire Chr valore assume ogni pulsante puoi lanciare uno sketch " preparatorio" in cui ti fai stampare a seriale l analog read sul pin e annoti che valori assume alla pressione di ogni tasto.
- Codice: Seleziona tutto
If(analogRead (pin) > soglia bassa && analogRead(pin)< soglia alta) {…}
Così quella if verrà eseguita solo se il pin ha valore analogico entro una soglia (che devi trovare sperimentalmente) diversa da pulsante a pulsante.
Per capire Chr valore assume ogni pulsante puoi lanciare uno sketch " preparatorio" in cui ti fai stampare a seriale l analog read sul pin e annoti che valori assume alla pressione di ogni tasto.
10 messaggi
• Pagina 1 di 1
Torna a Realizzazioni, interfacciamento e nozioni generali.
Chi c’è in linea
Visitano il forum: Nessuno e 1 ospite

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


