Go Down

Topic: Primo programma accensioni luci (Read 1 time) previous topic - next topic

Nicola88

Jun 21, 2013, 07:42 pm Last Edit: Jun 21, 2013, 08:25 pm by Nicola88 Reason: 1
Salve a tutti sono nuovo del forum e ho appena acquistato arduino uno.
Siccome faccio l' elettricista il primo programma che mi è venuto in mente è stato di fare l' accensione di un carico con un pulsante replicando un relè passo-passo.
Questo è il programma
Code: [Select]

const int Pulsantepin = 2;
const int Utilizzatorepin = 3;

int Statopulsante;
int Statoutilizzatore;

void setup ()
{
 
 Serial.begin(9600);
 pinMode (Pulsantepin, INPUT);
 pinMode (Utilizzatorepin, OUTPUT);
}
 
void loop ()
{
 
 Statopulsante = digitalRead (Pulsantepin);
 Statoutilizzatore = digitalRead (Utilizzatorepin);

 if (Statopulsante==HIGH)
   if (Statoutilizzatore==HIGH)
   {
     Statoutilizzatore=LOW;
     digitalWrite (Utilizzatorepin, Statoutilizzatore);
     delay(500);
   }
   else
   {
     Statoutilizzatore=HIGH;
     digitalWrite (Utilizzatorepin, Statoutilizzatore);
     delay(500);
   }
}

Per risolvere il problema del pulsante ho dovuto aggiungere i delay (500). Il problema è se io aggingo molte accensioni tutti questi delay mi farebbero funzionare male il programma.
Lo stesso problema lo avrei se dovessi temporizzare una accensione per replicare un relè luci scale che stà acceso per esempio 3 minuti. Durante questi 3 minuti il programa è fermo e non accetta nessun comando per esempio l' accensione di un altro punto luce.
Per risolvere ho scritto questo altro programma ma non funziona il led non risponde bene ai comandi e si accende con poca illuminazione.

Code: [Select]

const int Pulsantepin = 2;
const int Utilizzatorepin = 3;

int Statopulsante;
int Statoutilizzatore;

unsigned long int Tempo;
unsigned long int Tempopulsante;
unsigned long int Tempoutilizzatore;

void setup ()
{
 Tempo=millis ();
 Tempopulsante=millis();
 Tempoutilizzatore=millis();
 Serial.begin(9600);
 pinMode (Pulsantepin, INPUT);
 pinMode (Utilizzatorepin, OUTPUT);
}  
void loop ()
{
 Tempo=millis ();
 if (Tempo>Tempopulsante+20)
 {
   Statopulsante = digitalRead (Pulsantepin);
   Tempopulsante=millis();
 }
 if (Tempo>Tempoutilizzatore+20)
 {
   Statoutilizzatore = digitalRead (Utilizzatorepin);
   Tempoutilizzatore=millis ();
 }  


 if (Statopulsante==HIGH)
   if (Statoutilizzatore==HIGH)
   {
     Statoutilizzatore=LOW;
     digitalWrite (Utilizzatorepin, Statoutilizzatore);
   }
   else
   {
     Statoutilizzatore=HIGH;
     digitalWrite (Utilizzatorepin, Statoutilizzatore);

   }
}

c' è qualcuno che può aiutarmi? Grazie in anticipo.

nid69ita

Il codice deve essere racchiuso negli appositi tag   [ code]   e   [/ code]   (senza spazi, li ho messi per farli vedere)
come da regolamento. Altrimenti, 1) l'admin ti cazzia  ]:), 2) alcune parti del codice potrebbero essere in parte mancanti   :smiley-eek-blue:
my name is IGOR, not AIGOR


danyevo

Perche a
hai messo:
Serial.begin(9600);

con chi devi comunicare?

danyevo

Prova così:
Code: [Select]

const int Pulsantepin = 2;
const int Utilizzatorepin = 3;

int Statopulsante;
int Statoutilizzatore;

void setup ()
{
 
  Serial.begin(9600);
  pinMode (Pulsantepin, INPUT);
  pinMode (Utilizzatorepin, OUTPUT);
}
 
void loop ()
{
 
  Statopulsante = digitalRead (Pulsantepin);
  Statoutilizzatore = digitalRead (Utilizzatorepin);
const int Pulsantepin = 2;
const int Utilizzatorepin = 3;

int Statopulsante;
int Statoutilizzatore;

void setup ()
{
 
  Serial.begin(9600);
  pinMode (Pulsantepin, INPUT);
  pinMode (Utilizzatorepin, OUTPUT);
}
 
void loop ()
{
 
  Statopulsante = digitalRead (Pulsantepin);
  Statoutilizzatore = digitalRead (Utilizzatorepin);
  delay(500);

  if (Statopulsante==HIGH)
    if (Statoutilizzatore==HIGH)
    {
      Statoutilizzatore=LOW;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
     
    }
    else
    {
      Statoutilizzatore=HIGH;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
     
    }
}
  if (Statopulsante==HIGH)
    if (Statoutilizzatore==HIGH)
    {
      Statoutilizzatore=LOW;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
     
    }
    else
    {
      Statoutilizzatore=HIGH;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
   
    }
}

taraschi

non puoi bloccare il programma con delay . per inserire o disinserire delle accensioni in base ai pulsanti
premuti  devi memorizzare lo stato dei pulsanti o la loro commutazione ed in base al loro stato
commutare lo stato delle lampade .

Nicola88

Grazie per le risposte.
Il Serial.begin l' ho messo perchè in un futuro la scheda dovrà comunicare con altre schede, in questo momento non serve ma in un futuro si.
Lo stato del pulsante l' ho memorizzato in una variabile il delay che ho messo serve per eliminare il problema dei rimbalsi del pulsante.
Adesso provo il codice che mi hai inviato.
Se volessi aggiungere al programma, che adesso accende e spegne un led come un relè passo-passo, anche una accensione temporizzata per esempio spingo un altro pulsante che accende un altro led per 3 minuti non posso utilizzare delay perchè bloccherebbe tutto il programma. Penso che dovrei utilizzare millis() ma non ho capito bene come funziona.

leo72

Ti passo un link ad un articoletto che ho scritto in cui spiego come programmare i compiti usando milis:
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

Affronto il problema di 1 compito, e poi il problema di 2 compiti.
Per cose più impegnative ho fatto anche un paio di scheduler, uno basato su millis (looper), ed uno un pò più complesso basato sugli interrupt (leOS).

Nicola88

Grazie leo il tuo articolo sembra chiaro.
Adesso faccio un pò di prove.

danyevo


Nicola88

Si grazie ho provato ho copiato il codice con copia e incolla ma mi d' ha un errore quando faccio la verifica ma non ho avuto il tempo di capire qualè l' errore.

nid69ita

Manca la graffa aperta dopo:
if (Statopulsante==HIGH) {
my name is IGOR, not AIGOR

danyevo

errore corretto, comunque il delay antirimbalso lo devi mettere solo sotto la lettura del pin digitalRead e non ogni volta che chiedi lo stato del pin sul programma, tanto la lettura avviene una volta sola ad ogni ciclo e viene memorizzata.
così l'errore non cè piu:
Code: [Select]


const int Pulsantepin = 2;
const int Utilizzatorepin = 3;

int Statopulsante;
int Statoutilizzatore;

void setup ()
{
 
  Serial.begin(9600);
  pinMode (Pulsantepin, INPUT);
  pinMode (Utilizzatorepin, OUTPUT);
}
 
void loop ()
{
 
  Statopulsante = digitalRead (Pulsantepin);
  Statoutilizzatore = digitalRead (Utilizzatorepin);
  delay(500);

  if (Statopulsante==HIGH)
    if (Statoutilizzatore==HIGH)
    {
      Statoutilizzatore=LOW;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
    }
    else
    {
      Statoutilizzatore=HIGH;
      digitalWrite (Utilizzatorepin, Statoutilizzatore);
    }
}


Nicola88

Adesso provo il codice che mi hai mandato.


Go Up