Aiuto primi sketch.

Ciao a tutti, sto cominciando a realizzare i primi circuiti e sketch utilizzando Arduino_0017. Sto trovando meno difficoltà del previsto, ma ci sono un paio di cose che proprio non riesco a risolvere:

const int buttonPin = 2;     // il pin del pulsante
const int ledPin =  13;      // il pin del LED

int buttonState = 0;         // variable for reading the pushbutton status
int lastButtonState = 0; 
int buttonPushCounter = 0;

void setup() {
  pinMode(ledPin, OUTPUT);    // Inizializzazione dei pin LED come output 
  pinMode(buttonPin, INPUT);  // inizializzazione del pin del pulsante come input
  Serial.begin(9600);         // inizializzazione comunicazione seriale 
}

void loop() {
   // Legge il pin del pulsante:
  buttonState = digitalRead(buttonPin);
   // compara il buttonState con il precedente stato
    if (buttonState != lastButtonState) {
    
     if (buttonState == HIGH) {
      Serial.println("Rilevata pressione:");    
      buttonPushCounter++;
    } 
    lastButtonState = buttonState; // Memorizza lo stato corrente come ultimo stato
      if (buttonPushCounter % 2 == 0) {
       digitalWrite(ledPin, LOW);
       Serial.println("Luci spente.");
      } 
       else {
        digitalWrite(ledPin, HIGH);
        Serial.println("Luci accese.");
       }
}
}

Questo sketch è una versione dell' example Button leggermente modificato.
Alla pressione del bottone si accende il led e appare sul Serial Monitor:
Rilevata pressione
Luci accese.
Luci accese.
Praticamente scrive "Luci accese." quando premo e quando rilascio il bottone.
Alla successiva pressione:
Rilevata pressione
Luci spente.
e al rilascio del bottone di nuovo
Luci spente.
Come faccio per evitare questo doppio messaggio?
Esiste un modo più elegante per raggiungere lo stesso scopo?

Altra curiosità su quest'altro sketch:

const int ledPin = 10;
byte brightness = 0;
char c;
void setup(){
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (brightness < 255) { 
  Serial.println("Inizio test. -> ");
   for (brightness = 0; brightness < 255; brightness++) {
    analogWrite(ledPin, brightness);
    Serial.print("Valore luminosita': ");
    Serial.print(brightness, DEC);
    Serial.println("");
    delay(50);
   }
  analogWrite(ledPin, LOW);
  delay(1000);
  analogWrite(ledPin, brightness);
  delay(1000);
  analogWrite(ledPin, LOW);
  Serial.println("");
  Serial.println("Test terminato. Chiudere il Serial Monitor.");
}
}

Semplicemente accende il led con un valore da 0 a 255, raggiunta la massima intensità lo spegne, lo riaccende e infine lo spegne terminando lo sketch.
Ora per ottenere questo risultato in quint' ultima riga devo scrivere:

analogWrite(ledPin, brightness); //il cui valore in quel momento è 255

se scrivo:
analogWrite(ledPin, HIGH); il led si accende si, ma a luminosità minima, la stessa di quando brightness = 1.
Come mai il valore HIGH viene interpretato in questo modo?

Ultime due cose:

  1. Con Serial.println("..."); posso scrivere sul Serial Monitor messaggi e valori, ma per leggerli da tasiera?
    Ho trovato in giro cose del tipo
c = Serial.read();

Ma quando avvio lo sketch questa riga viene completamente ignorata, passando all'istruzione successiva.
Voi come fate?

  1. Usando Arduino_0017 devo scrivere tutto in un loop continuo, non si può evitare creando i loop con if, for, while, ecc.. invece di usarle per fermarlo?
    Usando il C++ classico funziona così ugualmente?

Scusate la miriade di domande, spero per voi troppo semplici, ma più sta e più si accumulano, e ci sto mettendo veramente impegno per capirci, ma vorrei fare tutto perfetto.
Grazie, Francesco.

Ragazzi un uppettino alla mia domanda? Dai che questi sketch sono belli e funzionanti provateli sul ledpin 13 con un bottoncino e ditemi!
Please!
Ciao Francesco.

Ciao!!
Non sono molto esperto, quindi potrei dirti delle grandi sciocchezze, ad ogni modo mi sembra che il tuo primo problema possa essere un problema di antirimbalzo!
Si dovrebbe risolvere con un delay di qualche millisecondo!!
Per quanto riguarda la tua seconda domanda credo sia normale!
Da quel che ho capito in questa mia esperienza con Arduino, HIGH si utilizza solo in caso di scrittura digitale su un pin, ed è pienamente equivalente ad 1. Quindi il funzionamento che hai riscontrato credo sia del tutto normale.
Leggere da tastiera onestamente non lo so fare...l'unica cosa che ho fatto fin'ora per fornire degli output ad Arduino è stato creare un socket tcp in php e spedirgli così i file tramite rete (usando uno shield Ethernet).
Ad ogni modo per sfruttare il "Serial.read()" di cui parli devi aprire il serial monitor ed inviare i messaggi direttamente di li!
Non so se esistono altri modi.
Infine penso non sia possibile uscire dalla struttura base di uno sketch Arduino...in fin dei conti il loop aiuta in molte situazioni!!
Considera che se non lo avessi il tuo micro servirebbe a ben poco!! :wink:

Spero di essere stato più o meno chiaro!
Ad ogni modo, un consiglio per il futuro: se posti richieste troppo lunghe sarà difficile trovare qualcuno che se le legga tutte e ti risponda, anche se non sono troppo complicate!
Prova a risolvere un problema per volta!! :slight_smile:
Ciao!!

Ciao
Per antirimbalzo penso che intendi che lo sketch legge sia lo stato high che low del pulsante, con un delay forse riuscirei a saltare la seconda lettura,tu il delay dove lo metteresti?

Per la seconda domanda ho capito che lo stato HIGH equivale a 1 però non capisco perchè l' istruzione digitalWrite (ledpin, HIGH); di solito accende il led alla sua massima luminosità, ma nel loop del mio esempio prende il valore 1 come luminosità minima.

Infine digital.read(); a me non funziona provando ovviamente ad inserire dati da serial monitor, che serva un delay anche in questo caso in modo che lo sketch attenda la lettura senza passare oltre.
Mah proverò e poi farò sapere, grazie della dritta del delay credo mi risolva più di un problema.

Grazie, Francesco.

  • Per quanto riguarda il leggere bene i tasti dai un occhio a questo:
  • mentre per la luminosità del led, nel primo post hai scritto questo:

analogWrite(ledPin, HIGH);

che è diverso da scrivere:

digitalWrite(ledPin, HIGH);

nel primo caso metti il PWM a 1 che è il minimo valore che gli puoi dare (a parte 0), mentre nel secondo caso usi il pin come uscita digitale ovvero che quando è HIGH hai 5V continui sul pin.

  • terza cosa: altro link che avresti potuto trovare facilmente è:

riguarda la seriale, i caratteri li leggi uno alla volta.
Quindi sfrutti l'istruzione Serial.available() per sapere quando ce n'è uno a disposizione e lo leggi con Serial.read().

Ciao Federico, grazie delle risposte illuminanti.
Per quanto riguarda i tasti io mi ero rifatto all 'esempio "state change detection" adesso provo a caricare debounce e vediamo che succede.
Per la luminosità hai ragione ho toppato alla grande, avendo caricato uno sketch di esempio non mi ero accorto che era analogwrite invece di digital (sto capendo adesso la differenza tra l'uso del led in analogico o digitale)
Per la lettura seriale devo dire che avevo visto e intuito il funzionamento, ma pensavo che quel serial available significasse:
esegui se c'è un qualche tipo di comunicazione seriale, non ci sono arrivato ad annidarla li la lettura con Serial.read();
Cose per voi molto facili, mi sembra di stare a buon punto è solo che sto assorbendo molte nozioni in poco tempo e a volte mi areno, non pensare per favore che voglio la pappa fatta o che mi fermo alla prima difficoltà e chiedo, ciao grazie ancora.
Francesco.