Go Down

Topic: Problemino sketch (Read 4174 times) previous topic - next topic

cece99

Sep 15, 2012, 11:13 am Last Edit: Sep 15, 2012, 11:29 am by cece99 Reason: 1
Oggi stavo preparando uno sketch per fare una centralina di luci per presepe, lo sketch non è completo ma ho già avuto dei problemi con i pulsanti che aumentano o diminuiscono il tempo di alba tramonto.
Questo è lo sketch, per il momento mostra i dati su un display lcd, a me pasta incrementare il valore delle 2 variabili che vengono stampater, x il pwm dopo mi arrangio XD.
Code: [Select]


int a = 0;
int b = 25;
int val = 0;
int val1 = 0;
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  lcd.begin(16, 2);
  lcd.print("Luci presepe by");
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print("Cesare Cacitti  ");
 
}

void loop() {

  delay(5000);
    val = digitalRead(7);
    if (val == HIGH) { 
    a=a+1;
  } 

      val1 = digitalRead(8);
    if (val1 == HIGH) { 
    a=a-1;
  } 

  lcd.setCursor(0, 0);
  lcd.clear();
  lcd.print("Giorno:");
  lcd.print(a);
  lcd.setCursor(0, 1);
  lcd.print("Notte:");
  lcd.print(b);

 
}

Grazie
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

leo72

E che problemi hai? Se non lo dici...  :P

Michele Menniti

è da ieri che sta dando i numeri, povero cecé, così giovane, già preda di sostanze dannose....
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

cece99


è da ieri che sta dando i numeri, povero cecé, così giovane, già preda di sostanze dannose....

praticamente se premo i bottoncini i numeri non cambiano in pratica non risponde ai miei comandi XD.
Menny, sai alla fine cos era? avevo inserito male il chip nella breadboard e faceva falso contatto (eppure l'ho inserito e disinserito una 10ina di volte -.-')
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

leo72

Perché hai messo quel delay(5000) all'inizio del loop? In questo modo la lettura dei pulsanti viene eseguita solo 1 volta ogni 5 secondi e se non cogli l'attimo esatto potresti non leggere la pressione. Se il motivo è evitare lo sfarfallio del display, metti la stampa sul display solo ogni 500/1000 ms, con un if basato su millis, ad esempio.
Inoltre come è sempre stato detto, metti 2 letture del pin separate da un piccolo delay per evitare rimbalzi del pulsantino e letture doppie/triple.

cece99


Perché hai messo quel delay(5000) all'inizio del loop? In questo modo la lettura dei pulsanti viene eseguita solo 1 volta ogni 5 secondi e se non cogli l'attimo esatto potresti non leggere la pressione. Se il motivo è evitare lo sfarfallio del display, metti la stampa sul display solo ogni 500/1000 ms, con un if basato su millis, ad esempio.
Inoltre come è sempre stato detto, metti 2 letture del pin separate da un piccolo delay per evitare rimbalzi del pulsantino e letture doppie/triple.

non mi è stato detto, ora continuo le prove.....
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

leo72

Non ho che scritto che sia stato detto a te, ma che è viene sempre detto, sottintendendo il forum. :P

cece99

oggi mi sono arrivati i pulsantini e ho cominciato a provare, questo è lo sketch che è uscito  XD
Code: [Select]
byte a = 0;
byte b = 25;
int val = 0;
int val1 = 0;
int val2 = 0;
int brightness = 0;   
#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  pinMode(6, INPUT);
  lcd.begin(16, 2);
  lcd.print("Luci presepe by");
  lcd.setCursor(0, 1);
  lcd.print("Cesare Cacitti  ");
  delay(5000);
 
}

void loop() {
    lcd.setCursor(0, 0);
  lcd.clear();
  lcd.print("Giorno:");
  lcd.print(a);
  lcd.setCursor(0, 1);
  lcd.print("Notte:");
  lcd.print(b);
  delay(100);

 

 

       val = digitalRead(7);
    if (val == HIGH) { 
    a=a-1;
  } 

      val1 = digitalRead(8);
    if (val1 == HIGH) { 
    a=a+1;
  } 


  } 

quello che vorrei fare è riuscire a mettere un interruttore che quando è chiuso mi permette di cambiare i tempi, e quando lo apro, mi fa partire una funzione basata sul fade, che mi fa fare il fade sul led con velocità della variabile a che ho già impostato con quella variabile.
Qualcuno potrebbe integrarmi nello sketch, un if (che funziona) nel quale dopo inserisco il fade?
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

tuxduino

Perché delay(5000) dopo il setup ?

Studiati bene blink without delay. Leggi ogni pulsante ogni 20-50ms (prova per vedere qual è il valore che dà la "responsività" migliore), e quando rilevi un cambio di stato (da premuto a rilasciato o viceversa) modifica il contatore.

Per quanto riguarda il fade, anche quello va inserito con la tecnica di blink without delay, altrimenti ti trovi a leggere i pulsanti solo all'inizio o alla fine del ciclo di fade, col risultato che l'oggetto diventa inutilizzabile.

PS: CTRL+T prima di postare il codice, grazie!

leo72


Perché delay(5000) dopo il setup ?

Per la schermata iniziale col suo nome  :P

tuxduino

Ah, già! Una volta l'ho fatto anch'io... ma solo per mostrare il nome del programma (e poi erano solo 3 secondi :P )

cece99

E cosa farebbe sto control T prima di postare il cosice, su mac os x mi apre una nuova scheda  :smiley-roll-sweat:.
Comunque non ci capisco nulla!
Ho creato uno sketch (non funzionante) per farvi capire cosa dovrei fare:
Code: [Select]

byte a = 0;
byte b = 25;
int val = 0;
int val1 = 0;
int val2 = 0;
int brightness = 0;   
#include <LiquidCrystal.h>


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  pinMode(7, INPUT);     
  pinMode(8, INPUT);   
  pinMode(6, INPUT);
  lcd.begin(16, 2);
  lcd.print("Luci presepe by");
  lcd.setCursor(0, 1);
  lcd.print("Cesare Cacitti  ");
  delay(5000);
 
}

void loop() {
    lcd.setCursor(0, 0);
  lcd.clear();
  lcd.print("Giorno:");
  lcd.print(a);
  lcd.setCursor(0, 1);
  lcd.print("Notte:");
  lcd.print(b);
  delay(100);
       val1 = digitalRead(8);
    if (val1 == HIGH) { 
   
       val = digitalRead(7);
    if (val == HIGH) { 
    a=a-1;
  } 

      val1 = digitalRead(8);
    if (val1 == HIGH) { 
    a=a+1;
  } 
else {
   //codice fade
  } 

 

    }


  } 


 
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

tuxduino

Quote
E cosa farebbe sto control T prima di postare il cosice, su mac os x mi apre una nuova scheda.


Autoformattazione del codice. La voce di menu è Strumenti => Formattazione automatica. Su Linux indica l'hotkey CTRL+T, su Mac non so.

cece99


Quote
E cosa farebbe sto control T prima di postare il cosice, su mac os x mi apre una nuova scheda.


Autoformattazione del codice. La voce di menu è Strumenti => Formattazione automatica. Su Linux indica l'hotkey CTRL+T, su Mac non so.

ok, ma nessuno sa aiutarmi?
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

tuxduino

Quote
ok, ma nessuno sa aiutarmi?


Allora siamo a questo punto: hai due pulsanti. Premendo uno di questi una variabile va incrementata. Premendo l'altro, la stessa variabile va decrementata.

Ti è stato fornito materiale in abbondanza per approfondire. Ti sono stati dati suggerimenti (vedi il debounce con doppia lettura), ma il tuo codice è ancora lì senza nemmeno una indentazione decente.

Scusa, ma secondo me prima di chiedere altro aiuto dovresti mostrare più impegno  :P

Go Up