Buongiorno! Avrei bisogno di due dritte!

Salve a tutti!

L'altroieri mi è arrivata una scheda Arduino UNO, e devo dire che sono contento del mio nuovo acquisto! :)

Io sono un ragazzino di 14 anni, che è appassionato all'elettronica e all'informatica, ma avrei bisogno di qualche aiuto con questo nuovo oggetto, non è che qualcuno più esperto di me mi può dare una mano?

Mi ritrovo con alcuni problemi a gestire gli input, non capisco certe cose... se qualcuno mi aiutasse a capire un po' di più ve ne sarei grato :D

Vi ringrazio in anticipo! Ciao!

inizia con specificare meglio cosa non capisci dell ' input , e cosa vorresti fare :)... Vediamo se possiamo aiutarti.

Inanzitutto grazie per la risposta! :D

No, io per esempio volevo fare in modo che se si premeva un bottone la velocità nel lampeggiare di un LED sia sempre minore... Questa era un'idea di partenza che mi ero fatto appena ho avuto tra le mani l'Arduino! :D

Ma forse è qualcosa di avanzato... fatemi sapere!

e ringrazio in anticipo!

Comincia con qualcosina di più semplice :):):)

Ciao, complimenti per la tua età, allora sei il futuro almeno così dicono.
Bene tu vuoi far lampeggiare un led con frequenza variabili.

Vuoi che la frequenza di lampeggio sia un parametro utente.
L’utente vuole aumentare e ridurre la frequenza del lampeggio.

Quindi riassumendo ti serve:
1 Arduino, ovvio. :slight_smile:
1 Led
1 Resistenza da 330 ohm a 1000 ohm, dipende quella che hai.
2 Pulsanti, o microswitch (Pulsate Up e Pulsante Down)
1 Programa, per fare tutto ciò detto prima.

Ti serve sapere:
collegare un Led ad arduino: fare un programma che lo fa lampeggiare.
collegare due pulsanti ad arduino, e fare fare qualcosa in base al pulsante premuto.

Se hai fatto questo il risultato è dietro l’angolo, tuttavia ci sono vari modi di farlo
il più corretto al momento non serve, ma serve il più semplice e comprensibile.

Alcuni indizzi:
Cicli for, e while, ++ (increment) e – (decrement), millis().

Il problema che ti poni di risolvere è spezzettabile in tanti sottoproblemi (lo sono quasi tutti),
risolvere un problema per volta.

Ciao.

Ragazzi, vi ringrazio veramente per le risposte!

@MauroTec: Diciamo che fino ad ora sono riuscito a fare (correttamente, poi come dici tu forse non è il metodo migliore, ma è l'unico che sono riuscito a creare con facilità) un progetto nel quale faccio lampeggiare due LED con diverse intermittenze. Un po ci ho capito di tutto questo, mi sono orientato con gli esempi proposti dal programma e poi ho modificato come mi suggeriva la fantasia e un po andando alla cieca, il risultato è venuto fuori! (Mi sono motivato.. :D )

Forse è vero anche quello che dice ratto93, ma non sapevo che altro inventarmi... Io per adesso provo a continuare a orientarmi tramite gli esempi, provando a modificarli, se comunque avete dei consigli sono sempre ben accetti!

Diciamo che fino ad ora sono riuscito a fare (correttamente, poi come dici tu forse non è il metodo migliore, ma è l'unico che sono riuscito a creare con facilità) un progetto nel quale faccio lampeggiare due LED con diverse intermittenze.

Io non ho detto esplicitamente che quello che adotti tu non è il modo migliore, per me la parola "migliore" sarebbe da usare sempre tra virgolette e quando possibile in sostituzione usare "più adatto".

Tutti credo che abbiano cominciato modificando qualcosa per capire come funziona, una volta capito si passa a modficare altro. Tuttavia poi non passi la vita modificando in quanto avrai imparato qualcosa, allora fai di testa tua, in questa fase il modo più adatto di affrontare un problema è scomperlo in piccoli pezzetti, e risolverli uno per volta.

Noterai che ogni singolo problema è risolvibile in vari modi e di ogniuno ne scoprirai i pregi e difetti e potrai dire questo modo è più adatto per risolvere il problema principale.

Alla fine di questa tiritera, posta il codice che hai modificato, spiegaci cosa fà e come sono collegati i componenti esterni. Usa l'icona "#" ed incolla il codice tra i tag che compaiono [code incolla qui [/code.

Ciao.

Ok grazie provo a rifare il codice (l'ultima volta non l'ho salvato :cold_sweat: )

ti serve anche conoscenza di millis, debounce e un minimo di "multitasking" di arduino, più facile a farsi che spiegarsi. conta che mentre lampegga il led devi fare i controlli, non basta un delay quindi oppure non farai in tempo a premere il pulsante o dovrei premerlo nel preciso momento del cambio di stato (decimi di millesimi di secondo)

Chello: Ragazzi, vi ringrazio veramente per le risposte!

@MauroTec: Diciamo che fino ad ora sono riuscito a fare (correttamente, poi come dici tu forse non è il metodo migliore, ma è l'unico che sono riuscito a creare con facilità) un progetto nel quale faccio lampeggiare due LED con diverse intermittenze. Un po ci ho capito di tutto questo, mi sono orientato con gli esempi proposti dal programma e poi ho modificato come mi suggeriva la fantasia e un po andando alla cieca, il risultato è venuto fuori! (Mi sono motivato.. :D )

Forse è vero anche quello che dice ratto93, ma non sapevo che altro inventarmi... Io per adesso provo a continuare a orientarmi tramite gli esempi, provando a modificarli, se comunque avete dei consigli sono sempre ben accetti!

Anche io ho cominciato così :):)

mi sà che un pò tutti abbiamo iniziato così… gli esempi sono lì apposta :slight_smile:
quoto il suggerimento sui temi che ti ha dato superlol e aggiungo solo che
se cerchi un punto da dove iniziare a documentarti sugli esempi e sulle librerie inizia da qui:
http://www.arduino.cc/playground/Italiano/HomePage
quello che non c’è o che non è chiaro puoi chiederlo qui :wink:

Allora ragazzi, mentre vado a documentarmi sulle "parolone" che mi avete appena detto, vi copio-incollo il codice che ho scritto fino adesso:

int butStat = 0;
int millisec = 1000;
void setup() {                
  pinMode(13, OUTPUT);
  pinMode(2, INPUT); 
}

void loop() {
  butStat = digitalRead(2);
  if (butStat = 1); {
    millisec = millisec / 2;
  }
  if (butStat = 0); {
    millisec = millisec ;
  }
  digitalWrite(12, HIGH);  
  delay(millisec);
    
  digitalWrite(12, LOW);   
  delay(millisec);              
}

.

(nella breadboard ho un led collegato tra il PIN 12 e il pin GND (si chiama massa?), un pulsante tra il PIN 2 e il PIN 5V, e ho messo una resistenza da 10KOhm tra il GND e il PIN 2).

Il problema è che se anche senza premere il pulsante mi dimezza la variabile "millisec" (presumo sia quello l'errore, il led si accende e si spegne molto velocemente all'inizio, dopodiché resta spento fisso) ; ho provato a vedere se avevo sbagliato qualcosa, ma non ho incontrato nessun problema... se mi individuate il problema mi fate un favore, io non ce l'ho fatta!

Ah, mi scuso se nei prossimi giorni non vi riesco a rispondere, sono al mare fino a domenica, e se non trovo da connettermi non so come accedere al forum...

non vedo un debounce e anche il fatto di mettere un delay come ti ho detto implica che devi schiacciare il pulsante esattamente a inizio del loop ;)

[OT] Ciao Chello, certo che da come scrivi e ti esprimi sembri molto più maturo dei tuoi 14 anni, un futuro da scrittore o giornalista, o quantomeno da insegnante, garantito! ;)

@superlol: quindi se io volessi fare la cosa che voglio devo o mettere un debounce come dici te oppure fare in modo che l'intermittenza non venga gestita dai delay? Ho capito bene? Adesso non ho a portata di mano ne l'Arduino ne un pc (sto usando il telefono), appena riesco a fare qualcosa provo a fare esperimenti e vi tengo aggiornati. @Menniti: lo so, in realtà la mia strada e questa qui, mi piace tutto ciò che e tecnologico. Per quanto riguarda il mio modo di scrivere, ci tengo a scrivere senza errori e in un modo elegante, soprattutto perché voglio distinguermi dai miei altri coetanei che vedo in giro su internet che scrivono in un modo stupido con tante abbreviazioni. Ma non voglio andare troppo O.T. A questo punto..

esatto, non puoi far gestire il lampeggio ad delay.

infatti il delay blocca l'esecuzione del programma il che significa che intanto il loop non va avanti ma si blocca fino alla fine di millis e poi riprende dopo tot tempo.

tu devi fare un lampeggio di questo tipo

NON TESTATO ED E' IL LISTATO COMPLETO, SE VUOI IMPARARE NON E' CONSIGLIATO MA SE LO USI PER CAPIRE ALLORA USALO PURE ;)

int delay = 1000;
int lastbut;
int lasttimebut;
int lasttimeblink;
int ledpin = ; // pin del led
int blinkstate = 0; // 0 spento, 1 acceso
int buttona = ; //pin del bottone per decrementare
int buttonb = ; //pin del bottone per incrementare
int debouncetime = ; //tempo in millisecondi per il debounce

void setup() {
  // setti input ed output, io faccio una cosa grossolana ora
  lasttimeblink = millis();
}

void loop() {
  digitalWrite(ledpin, blinkstate);
  if(millis()-lasttimeblink == delay) {
    if(blinkstate == 1) blinkstate = 0;
    else blinkstate = 1;
  }
  // qui sopra la parte che gestiva il blink sotto la parte dei pulsanti con debounce
  if(digitalRead(buttona) == HIGH) {
    if(buttona == lastbut) {
      if(millis()-lasttimebutton == debouncetime) delay = delay - 10;
    } else {
      delay = delay - 10;
    }
  }
  if(digitalRead(buttonb) == HIGH) {
    if(buttonb == lastbut) {
      if(millis()-lasttimebutton == debouncetime) delay = delay + 10;
    } else {
      delay = delay + 10;
    }
  }

}

come vedi non è una cosa troppo complicata ma neanche troppo facile, inoltre non vi è un sistema che eviti che il delay vada o in overflow o in negativo...

comunque c'è un'altro modo per farlo.. vediamo se lo capisci ;)

ora che sei al mare potresti per esempio prendere un foglio, 15 minuti e farti un diagramma di flusso e vedere come strutturare il programma... è una cosa che aiuta da paura...

Ti ringrazio, ora lo provo e lo sistemo! :D

non fare copia incolla, cerca di capire cosa ho scritto e perchè ;)

No ok, ho capito, adesso che sono tornato vedo quello che posso fare ;)

Ragazzi non ho capito, non riesco a combinare quello che voglio :astonished:

Per esempio non ho capito bene la funzione del comando millis; come cavolo funziona e a cosa serve di preciso? (ho letto un po la documentazione, ma oltre ad essere in inglese non ho capito!) :0

Poi ho un altra domanda: perchè si preferisce mettere delle variabili per indicare i pin e non si mette direttamente il numero nella riga?