Pages: [1] 2   Go Down
Author Topic: Primo programma accensioni luci  (Read 1327 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
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.
« Last Edit: June 21, 2013, 01:25:36 pm by Nicola88 » Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3494
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-evil, 2) alcune parti del codice potrebbero essere in parte mancanti   smiley-eek-blue
Logged

my name is IGOR, not AIGOR

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

grazie ho modificato  smiley-roll-sweat
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

con chi devi comunicare?
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova così:
Code:
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);
   
    }
}
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 20
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 .
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21618
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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).
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai provato con il mio codice?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 57
Posts: 3494
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Manca la graffa aperta dopo:
if (Statopulsante==HIGH) {
Logged

my name is IGOR, not AIGOR

Offline Offline
Full Member
***
Karma: 1
Posts: 116
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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);
    }
}

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 17
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Adesso provo il codice che mi hai mandato.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 102
Posts: 6558
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bastano anche 30 millisecondi.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1] 2   Go Up
Jump to: