Problema con canale D0

Scusatemi, sono un nuovo utilizzatore delle schede arduino e ho riscontrato il seguente problema:

Hocaricato un mio programmino sia su di un arduino uno R3 che su un arduino mega 256 utilizzando il canali relativi ai pin 0, 1 e 2 come ingresso digitali con delle resistenza di pull-down (verso masa) di 10K e il canale 0 non legge lo stato dell'ingresso ma resta sempre a livello alto.
E' un guasto delle mie schede o sto sbagliando qualcosa?

Grazie anticipatamente della cortesia

i canali 0 e 1 intendi i pin se si io non li userei, la seriale fa capo a essi e potresti avere dei malfunzionamenti (se non si deve, meglio evitare di usarli!!)

detto questo per essere più precisi bisognerebbe avere lo schema elettrico di come hai fatto icollegamenti e magari il programmino, cosi si può "vedere e capire" meglio :slight_smile:

Brizzolato59:
Scusatemi, sono un nuovo utilizzatore delle schede arduino...

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

sempre pronto NID :slight_smile: sempre super efficiente :slight_smile:

Scusatemi se prima non mi ero presentato.

Grazie per la rapida risposta
Vi allego lo schema che ho realizzato per provare il circuito, ora in uscita monto dei LED poi in pratica diventeranno dei rele con relativo circuito.

La funzionalità dovrebbe essere la sequente:

Con il pulsante "ON" attivare e disattivare l'allarme e l'uscita "alimentazione porta" (attiva a allarme disattivato.

Con il pulsante "CMD porta" aprire e la luce accendere o chiudere la porta

L'interruttore "Stato porta" risulta chiuso a porta chiusa.

ora il problema è che arduino vede sempre la porta chiusa.

Grazie ancora

Massimo

Allarme.ino (3.08 KB)

Allarme.PDF (34.3 KB)

lo schema sembra giusto (ma evita il pin 1 e 0 usali solo se ti puntano una pistola!!) ma nei led ci vanno le resitenze (senza rischi davvero di bruciare tutto)!!!!

il programmino... (ignoranza mia credo) ma non vedevo i goto dai tempi del C=64!! (mai visti in c/C++)

io ho un pò di difficoltà a comprenderlo..attendiamo dei veri programmatori :slight_smile:

Il tuo codice indentato e con le graffe a capo:

const int COON = 2;    // Ingresso Comando attiva/Disattiva
const int COPO = 1;    // Ingresso Comando Porta
const int STPO = 0;    // Ingresso Stato Porta
const int MOPO = 7;    // Uscita Muovi Porta
const int LAMP = 6;    // Uscita Lampeggiante
const int NEON = 5;    // Uscita Luce Neon
const int ALIM = 4;    // Uscita Alimentazione Porta
const int SIRE = 3;    // Uscita Sirena Allarme
int STATO = 0;  // stato attivazione allarme
const int ATTESAMOV = 10; // tempo di attesa movimentazione porta
const int ATTESALAM = 3; // tempo lampeggiante prima di movimentazione porta
const int TEMPOALARM = 30; // tempo durata sirena
const int TEMPOPAUSA = 10; // Tempo pausa Allarme
 
void setup() {
  // inizializza ingressi
  pinMode(COON, INPUT);
  pinMode(COPO, INPUT);
  pinMode(STPO, INPUT);   
  // inizializza Uscite
  pinMode(MOPO, OUTPUT);
  pinMode(LAMP, OUTPUT);
  pinMode(NEON, OUTPUT);
  pinMode(ALIM, OUTPUT);
  pinMode(SIRE, OUTPUT);
  digitalWrite(ALIM, HIGH);   
}

void loop() { 
  if(digitalRead(COON))  // Sequenza attiva/disattiva allarme
  { delay(100);
    label01:  
    if(digitalRead(COON)) { goto label01; }// attendi rilascio di on
    STATO = !STATO;
    digitalWrite(ALIM, !STATO);      
  } 
  if(digitalRead(COPO) && !STATO && digitalRead(STPO)) // Seguenza di Apertura
  { delay(100);
    label02:    
    if(digitalRead(COPO)) { goto label02; } // attendi rilascio di cmd Porta
    digitalWrite(NEON, HIGH); // accendi Luce
    MuoviPorta();
  }
  if(digitalRead(COPO) && !STATO && digitalRead(!STPO))  // Seguenza di Chiusura
  { delay(100);
    label03:    
    if(digitalRead(COPO)) { goto label03; }// // attendi rilascio di cmd Porta
    MuoviPorta();
  }
  if(digitalRead(STPO))  // Porta chiusa
  { delay(100);    
    if(digitalRead(STPO)) 
	{ digitalWrite(NEON, LOW); // Spegni Luce
    }
  }   
  if(!digitalRead(STPO) && STATO)  // sequenza di allarme
  { digitalWrite(LAMP, HIGH); // accendi Lampeggiante       
    digitalWrite(SIRE, HIGH); // accendi Sirena
    for (int i = 1; i <= TEMPOALARM; i++)   // Tempo di allarme
    { delay(1000);
      if(digitalRead(COON)) { i = TEMPOALARM + 1; } // se premuto on ferma sirena
    }
    digitalWrite(LAMP, LOW); // Spegni Lampeggiante       
    digitalWrite(SIRE, LOW); // Spegni Sirena 
    for (int i = 1; i <= TEMPOPAUSA; i++)  // Tempo di allarme
    { delay(1000);
      if(digitalRead(COON)) { i = TEMPOPAUSA + 1; } // se premuto ON disttiva allarme
    }
  }   
} 
  
void MuoviPorta(void) 
{ digitalWrite(LAMP, HIGH); // accendi Lampeggiante  
  delay(ATTESALAM * 1000); // attendi ATTESALAM secondi
  digitalWrite(MOPO, HIGH); //attiva movimento porta
  delay(500); // Impulso movimentazione porta di 500 mS
  digitalWrite(MOPO, LOW);  // Attendi ATTESAMOV
  for (int i = 1; i <= ATTESAMOV; i++)  { 
    delay(1000);
  }
  digitalWrite(LAMP, LOW); // spegni Lampeggiante     
}

Quei goto vari, esempio:

label02:    
    if(digitalRead(COPO)) { goto label02; } // attendi rilascio di cmd Porta

si possono eliminare usando un semplice while:

while(digitalRead(COPO)) ; // attendi rilascio di cmd Porta, cicla finchè condizione vera

Come detto, evita pin 0 e 1.
Io ti consiglio di vedere sul forum e internet il concetto di State Machine o macchina a stati.
Hai un unico loop() ovvero ciclo infinito e una variabile di stato che deve eseguire le parti di codice a secondo del "momento" o stato in cui sei. E' più semplice da capire ed eventualmente da modificare rispetto al tuo codice a blocco, monolitico.
macchina-a-stati-finiti-e-arduino

Nello schema hai fatto un grosso errore: sulle uscite digitali a LED non hai inserito i resistori di limitazione corrente (330 ohm) senza dei quali puoi bruciare le uscite.

Per gli ingressi ti suggerisco di modificare lo schema in modo che i pulsanti chiudano verso massa: è vero che dovrai invertire la logica da HIGH a LOW, ma come vantaggio puoi eliminare i resistori esterni di pull down ed usare quelli interni di pull up da 20k con l'istruzione pinMode(pin, INPUT_PULLUP);

Il D0 resta sempre High perchè il pin 9 (TXD1) di ATmega16U2 di arduinoUNO è collegato a D0 (RXD) di atmega328 mediante una resistenza da 1k (rete resistiva cat16) quindi forma un partitore 1k-10k , essendo a riposo il pin9 di atmega16u2 sempre high anche D0 è sempre a 4.5V circa. per ovviare a questo problema hai 2 soluzioni:
-1) o usi il D0 sempre come uscita ,
-2) o togli la tua R8 da 10k e colleghi "pulsante_porta" verso gnd, la pullup non serve perchè hai la 1k interna

io preferirei la soluzione1

Grazie mille per la gentilezza e la cortesia
Ma non ho ancora capito se il "difetto" che solo il pin 0 mi resta sempre a livello alto è normale o è un guasto della mia scheda.

test veloce... la seriale comunica? (legge e trasmette) se si la porta dovrebbe essere Viva e vegeta (sennò non comunicherebbe)
:slight_smile:

rileggi quanto detto da ICIO :wink:

Brizzolato59:
Grazie mille per la gentilezza e la cortesia
Ma non ho ancora capito se il "difetto" che solo il pin 0 mi resta sempre a livello alto è normale o è un guasto della mia scheda.

È fisiologico perché quei pin sono la seriale che é collegato attraverso l'addattatore seriale/ USB ( FT232 o ATmega16U2) alla USB del PC.

Ciao Uwe