Go Down

Topic: Incrocio Semaforico a 4 postazioni (Read 602 times) previous topic - next topic

docdoc

Quote
Perchè dici che non funziona? che problema riscontri?
Ho creato il progetto in thinkercad posizionando i componenti e i collegamenti.
Ma l'errore (almeno questo mostrato) è chiaro...
Definisci un array a 4 valori e ne inizializzi 6?

Poi ci sono altri problemi ma, scusami, se non indenti decentemente mi rifiuto di proseguire, perché ti basta fare  un Ctrl-T nell'IDE e postare il codice indentato "bene".

E già allora puoi forse anche tu vedere qualcuno degli altri errori...
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

astroboy81

Quote
Ma l'errore (almeno questo mostrato) è chiaro...
Definisci un array a 4 valori e ne inizializzi 6?

in effetti volevo capire bene come utilizzare questa funzione....

Quote
Poi ci sono altri problemi ma, scusami, se non indenti decentemente mi rifiuto di proseguire, perché ti basta fare  un Ctrl-T nell'IDE e postare il codice indentato "bene".

E già allora puoi forse anche tu vedere qualcuno degli altri errori...

tieni conto sempre che non sono esperto,e magari qualcosa non la so....

maubarzi

Si, tranquillo, si era notato un cicinin.
Scusa se faccio sempre domande, ma perchè, conoscendo poco niente del linguaggio di programmazione, ti stavi ponendo il problema di ottimizzare il codice?
Cioè, se hai solo una vaga idea di cosa sia un ciclo for, che tipo di ottimizzazioni pensavi di fare?
Visto che hai una base di partenza funzionante, studiati bene quella e poi cerca di modificare un singolo pezzo per volta.
Ad es. da
Code: [Select]

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
}

a
Code: [Select]

void setup()
{
  for (byte i = 2; i <= 13; i++) {
    pinMode(i, OUTPUT);
  }
}

cercando di imparare, applicandoli, i fondamentali.
Che puoi trovare un po' ovunque cercando guide o documenti sul linguaggio C o C++.
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

nid69ita

my name is IGOR, not AIGOR

Standardoil

#19
May 25, 2019, 09:24 am Last Edit: May 26, 2019, 08:54 am by Standardoil
stanotte, invece di dormire ho pensato
e invece di pensare ad "aiutatemi ad aiutarvi" ho pensato al semaforo (vergogna vergogna.....)
e ho tirato fuori questo:
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare:
// Semaforo alternativo

enum statisemaforo {SEM_SPENTO, SEM_VERDE, SEM_GIALLO, SEM_ROSSO, SEM_LAMPEGGIO, SEM_INIT};
// stati possibili di un semaforo, dove SEM_INIT è monostabile su SEM_SPENTO


typedef struct Semaforo_struct
{

    byte verde; // pin luce verde
    byte rosso; // pin loce rossa
    byte giallo; // pin luce gialla
    statisemaforo statoattuale; // lo stato attuale del semforo
    statisemaforo inizializza(void)
    {
        // inizializza il semaforo
        // provando anche le sue lampade
        pinMode(verde, OUTPUT);
        digitalWrite(verde, HIGH);
        delay(100);
        digitalWrite(verde, LOW);
        pinMode(rosso, OUTPUT);
        digitalWrite(rosso, HIGH);
        delay(100);
        digitalWrite(rosso, LOW);
        pinMode(giallo, OUTPUT);
        digitalWrite(giallo, HIGH);
        delay(100);
        digitalWrite(giallo, LOW);
        statoattuale = SEM_SPENTO;
        return statoattuale;
    }
    statisemaforo stato(void)
    {
        return statoattuale;
    }

    statisemaforo azione(statisemaforo comando)
    {
        statoattuale = comando;

        switch (comando)
        {
            case SEM_SPENTO:
                digitalWrite(verde, LOW);
                digitalWrite(rosso, LOW);
                digitalWrite(giallo, LOW);
                break;

            case SEM_VERDE:
                digitalWrite(verde, HIGH);
                digitalWrite(rosso, LOW);
                digitalWrite(giallo, LOW);
                break;

            case  SEM_GIALLO:
                digitalWrite(verde, HIGH);
                digitalWrite(rosso, HIGH);
                digitalWrite(giallo, LOW);
                break;

            case SEM_ROSSO:
                digitalWrite(verde, LOW);
                digitalWrite(rosso, LOW);
                digitalWrite(giallo, HIGH);
                break;

            case SEM_LAMPEGGIO:
                // lampeggio sarà il problema
                digitalWrite(verde, LOW);
                digitalWrite(rosso, LOW);
                digitalWrite(giallo, LOW);
                break;

            case SEM_INIT:
                // ntd, ci pensa una funzione apposta
                statoattuale = inizializza();
                break;

            default:
 
                break;
        }
        return statoattuale;
    }
} Semaforo;


Semaforo semafori[] = {{2, 3, 4}, {5, 6, 7,}, {8, 9, 10}, {11, 12, 13}};
// dichiaro un array di semafori, ognuno con 3 pin di uscita (rosso, giallo, verde) e lo stato iniziale a zero
byte Nsemafori = sizeof(semafori) / sizeof(semafori[0]);


void setup(void)

{
    // inizializzo i semafori
    for (byte i = 0; i < Nsemafori; i++)
    {
        semafori[i].azione(SEM_INIT);
        // invoco il metodo azione con argomento lo stato di inizializzazione del sameforo
        // in alterativa potevo invocare direttamente il metodo inizializza() senza argomento
    }
}

void loop(void)
{
    static byte passo = 0;
    passo = passo % numerostati;
}



poi però è arrivato il sonno e non ho finito, ma manca poco, sono al 90perccenttooo del lavoro, ancoa
vi piace?
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Datman

#20
May 25, 2019, 11:09 am Last Edit: May 25, 2019, 11:48 pm by Datman
Accoppiando i semafori, hai solo 4 condizioni:

rosso verde DURV
rosso giallo DURG
verde rosso DURV
giallo rosso DURG

0ppure 6 condizioni, se vuoi fare come nella realtà, con uno o due secondi di rosso per tutti:

rosso verde
rosso giallo
rosso rosso
verde rosso
giallo rosso
rosso rosso

Puoi fare 4 o 6 #define e poi richiamarle in sequenza:

Code: [Select]
#define stato1 spegniTutto();digitalWrite(rosso1,HIGH);digitalWrite(verde2,HIGH)

#define stato2 spegniTutto();digitalWrite(rosso1,HIGH);digitalWrite(giallo2,HIGH)
// #define stato2 spegniTutto();digitalWrite(rosso1,HIGH);digitalWrite(verde2,HIGH);digitalWrite(giallo2,HIGH)

#define stato3 spegniTutto();digitalWrite(verde1,HIGH);digitalWrite(rosso2,HIGH)

#define stato4 spegniTutto();digitalWrite(giallo1,HIGH);digitalWrite(rosso2,HIGH)
// #define stato4 spegniTutto();digitalWrite(verde1,HIGH);digitalWrite(giallo1,HIGH);digitalWrite(rosso2,HIGH)

void spegniTutto()
{
digitalWrite(rosso1,LOW);
digitalWrite(giallo1,LOW);
...
}

Se utilizzi solo la porta D da D0 a D5 (I/O da 0 a 5) per comandare le luci, puoi scrivere più semplicemente:
void spegniTutto() {PORTD&=0b11000000;}


// Durata dei verdi:
#define DURV 10

// Durata dei gialli:
#define DURG 3

unsigned long t;

void setup()
{
t=millis()/1000;
}

void loop()
{
if (millis()/1000-t>=DURV+DURG+DURV+DURG) t=millis/1000;

if      (millis()/1000-t>=DURV+DURG+DURV) stato4;
else if (millis()/1000-t>=DURV+DURG) stato3;
else if (millis()/1000-t>=DURV) stato2;
else stato1;

/*In maniera forse più comprensibile, si può anche scrivere:
if      (millis()/1000-t<DURV) stato1;
else if (millis()/1000-t<DURV+DURG) stato2;
else if (millis()/1000-t<DURV+DURG+DURV) stato3;
else stato4;
*/
}

P.S.: non ho verificato bene le condizioni. Potrebbe esserci qualche errore...
P.P.S.: il punto e virgola alla fine dei #define stato1, ... può essere omesso, in quanto vengono aggiunti negli "if" :-)
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

maubarzi

Dalle mie parti il giallo si accende senza spegnere il verde, visto che hai aggiunto i 2 secondi di rosso per tutti...
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Datman

#22
May 25, 2019, 11:34 am Last Edit: May 25, 2019, 04:33 pm by Datman
Fatto così, ci vuole poco a modificarlo come si preferisce :-)
Ecco: ho corretto qualche errore e ho aggiunto due righe, poste come commento, che possono essere sostituite a quelle che le precedono per avere giallo+verde.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Standardoil

sono tornato, dopo notti di bagordi...
vorrei spiegare perchè ho fatto tuuuttoo quel lavoro su strutture e membri per un semplice semaforo
a parte che sto provando ad imparare, ma l'idea generale sarebbe di spostare la complessità dal programma al dato, come dico spesso io
se un incrocio viene dichiarato come array di semafori che si inizializzano da soli (fanno loro le loro stesse pinmode) descriverne il funzionamento è poco più che elencarne gli stati successivi e come si alternano, che a sua volta viene bene con struct e array, mi sembra)
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Go Up