Salve a tutti voi del forum, vi ringrazio anticipatamente per l'aiuto che mi darete anche se non otterremo dei risultati concreti :),
il mio problema è questo sto lavorando su un progettino che a parole sembra semplice ho letto tantissimo su internet riguardo ad arduino ma prima di acquistarlo ho provato a capire le sue funzioni quindi mi son detto prima di spendere dei soldini proviamo con il simulatore
ho sviluppato un programma che nel momento in cui premo un pulsante si dovrebbe accendere un led per un tempox e lasciarlo acceso finchè tempo non arriva a zero ma vorrei anche che nel bel mezzo del programma se io ripremo il pulsante il tempo si deve incrementare sempre di x e continuare a tenermi acceso il led finchè tempo non arriva a zero quindi io ho sviluppato questo:
// Definisco le porte
const int LED=13; // il led predefinito della porta 13
const int SENSOR=10; // questo è il pin del bottone o del gettone
// Definisco le variabili
int tempo=0;
void setup() {
// setto le porte come input o output
pinMode(LED, OUTPUT);
pinMode(SENSOR, INPUT);
}
void loop() {
// Da qui eseguo il programma
// leggo lo stato del sensore se premuto avvio il contatore
if (digitalRead(SENSOR)) // se il sensore e "ALTO"
{
tempo+=60; // aumento il tempo di 60
delay(15); // aspetto 15 microsecondi per scaricare correnti parassite nel circuito dei sensori
}
if (tempo!=0) // se il tempo e diverso da 0 avvio il contatore
{
tempo--; // tolgo 1 al tempo
digitalWrite(LED,HIGH); // accendo il led per tempo che rimane
}
else{
digitalWrite(LED,LOW); // spegni il led
}
}
ora vorrei capire perchè sul simulatore questo programma funziona bene e ora che provu su arduino il led si accende solo se temgo premuto il pulsante?
aiutatemi credo che sia un errore stupido e banale quello che ho fatto ma non riesco a venirne fuori
Secondo me quel 60 è troppo poco come valore.
Sai che ci mette un atmega a fare un ciclo ed a portarti a 0 quel valore? Anche considerando il delay(15).
ho gia provato a incrementare tempo addirittura sono arrivato a mettere tempo= 60000; ottenendo sempre lo stesso risultato e l'altra cosa molto strana e che se ripremo piu di una volta il pulsante non mi incrementa di x il valore tempo
roma scusami ma mi sono gia perso sono solo un auto didatta cosa dovrei fare con il monitor seriale lui mi da on e off direttamente premo ed esce on per un istante e poi subito of
// Definisco le porte
const int LED=13; // il led predefinito della porta 13
const int SENSOR=10; // questo è il pin del bottone o del gettone
// Definisco le variabili
int tempo=0;
void setup() {
// setto le porte come input o output
pinMode(LED, OUTPUT);
pinMode(SENSOR, INPUT);
Serial.begin(9600);
}
void loop() {
// Da qui eseguo il programma
// leggo lo stato del sensore se premuto avvio il contatore
if (digitalRead(SENSOR)) // se il sensore e "ALTO"
{
tempo+=60; // aumento il tempo di 60
delay(15); // aspetto 15 microsecondi per scaricare correnti parassite nel circuito dei sensori
}
if (tempo!=0) // se il tempo e diverso da 0 avvio il contatore
{
tempo--; // tolgo 1 al tempo
digitalWrite(LED,HIGH); // accendo il led per tempo che rimane
}
else{
digitalWrite(LED,LOW); // spegni il led
}
Serial.print("Tempo: ");
Serial.println(tempo);
}
e vedrai nella console seriale quanto tempo ci mette "tempo" a diventare 0.
P.S.: Ricordati di inserire il codice nel tag "code".
oddio scusami erpomata sono cosi fuso che leggevo solo roma la tua città e non mi rendevo conto che il tuo nick invece è erpomata :)...
avrei un altra domanda da farti a posto della seriale potrei aggiungere allora lcdcrystal
quindi se voglio aggiungere lcd al posto del monitor seriale il programma sarà così
// Definisco le porte
const int LED=13; // il led predefinito della porta 13
const int SENSOR=7; // questo è il pin del bottone o del gettone
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
// Definisco le variabili
int tempo=0;
void setup() {
// setto le porte come input o output
lcd.begin(16, 2);
lcd.print("in funzione");
pinMode(LED, OUTPUT);
pinMode(SENSOR, INPUT);
}
void loop() {
// Da qui eseguo il programma
// leggo lo stato del sensore se premuto avvio il contatore
if (digitalRead(SENSOR)) // se il sensore e "ALTO"
{
tempo+=60; // aumento il tempo di 60
delay(1); // aspetto 15 microsecondi per scaricare correnti parassite nel circuito dei sensori
}
if (tempo!=0) // se il tempo e diverso da 0 avvio il contatore
{
tempo--; // tolgo 1 al tempo
digitalWrite(LED,HIGH); // accendo il led per tempo che rimane
}
else{
digitalWrite(LED,LOW); // spegni il led
}
lcd.setCursor(0, 1);
lcd.print("Tempo: ");
lcd.println(tempo);
}
allora ragazzi il programma è questo ilprogramma sembra funzionare ma solo per un minuto cioè premo il pulsante e parte il led per 60 secondi sul display compare il conto alla rovescia ma se ripremo il pulsante il tempo non incrementa quindi per intuito credo che il problema si trova sul delay(1000) che ho inserito come risolvere? lo sketch é questo ( so che non si inserisce in questo modo ma ancora non ho capito come si fa spero perdoniate la mia incompetenza)...
sketch:
// Definisco le porte
const int LED=13; // il led predefinito della porta 13
const int SENSOR=7; // questo è il pin del bottone o del gettone
#include <LiquidCrystal.h>
// initialize the library with
// the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Definisco le variabili
int tempo=0;
void setup() {
// setto le porte come input o output
lcd.begin(16, 2);
lcd.print("in funzione");
pinMode(LED, OUTPUT);
pinMode(SENSOR, INPUT);
}
void loop() {
// Da qui eseguo il programma
// leggo lo stato del sensore se premuto avvio il contatore
if (digitalRead(SENSOR)) // se il sensore e "ALTO"
{
tempo+=60; // aumento il tempo di 60
}
if (tempo!=0) // se il tempo e diverso da 0 avvio il contatore
{
tempo--; // tolgo 1 al tempo
digitalWrite(LED,HIGH); // accendo il led per tempo che rimane
delay(1000);
}
else{
digitalWrite(LED,LOW); // spegni il led
}
lcd.setCursor(0, 1);
lcd.print("Tempo: ");
lcd.print(tempo);
}
Il problema è che con delay(1000) blocchi l'esecuzione del codice per 1 secondo e quindi tu dovresti premere il pulsante nell'intervallo di tempo tra un delay e quello successivo, quindi hai una frazione di secondo per farlo (millisecondi?).
Secondo me dovresti seguire il consiglo che ti hanno già dato:
PaoloP:
Il ciclo dell loop è velocissimo
Metti un delay(1); come prima istruzione e incrementa il tempo di +1000 almeno.
60 non sono millisecondi ma sono 60 cicli del loop. Con il delay(1) invece diventano 60 cicli di 1 millisecondo+tempo di elaborazione, più o meno.
diciamo cosi:
// Definisco le porte
const int LED=13; // il led predefinito della porta 13
const int SENSOR=7; // questo è il pin del bottone o del gettone
#include <LiquidCrystal.h>
// initialize the library with
// the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Definisco le variabili
int tempo=0;
void setup() {
// setto le porte come input o output
lcd.begin(16, 2);
lcd.print("in funzione");
pinMode(LED, OUTPUT);
pinMode(SENSOR, INPUT);
}
void loop() {
// Da qui eseguo il programma
// leggo lo stato del sensore se premuto avvio il contatore
if (digitalRead(SENSOR)) // se il sensore e "ALTO"
{
tempo+=60000; // aumento il tempo di 60
}
if (tempo!=0) // se il tempo e diverso da 0 avvio il contatore
{
tempo--; // tolgo 1 al tempo
digitalWrite(LED,HIGH); // accendo il led per tempo che rimane
delay(1);
}
else{
digitalWrite(LED,LOW); // spegni il led
}
lcd.setCursor(0, 1);
lcd.print("Tempo: ");
lcd.print(tempo);
}
grazie per aver risposto ma ora sul display non mi compare un conto alla rovescia accettabile cioè 60 59 58 57 etc....fino a 0 ma mi compare un 300000 che va a scalare di un ms per volta e poi se ripremo il pulsante il numero diventa negativo
Bè perchè aumenti tempo in millisecondi e non in secondi, dividi per 1000.
Inoltre ti diventa negativo perchè probabilmente andrai in overflow, prova a dichiarare tempo di tipo "unsigned long".