Tricka90 ha scritto:Stai attento, al fototransistor ricevitore stai dando una tensione eccessiva, sei proprio al limite del Absolute Maximum Rating (vedi datasheet). Rischi di farlo fuori.
...ma non è 30 V tra collettore ed emettitore?
Comunque ho risolto i problemi erano dovuti a:
-Un anno che non programmavo più
-il filo Jumper di massa tra arduino e alimentatore che faceva falsi contatti mandandomi il segnale in floating
-"errata" configurazione Software-Hardware
Ho risolto facendo una lettura analogica del segnale e stabilendomi io la soglia per stato logico Alto Basso.
Quindi ho riscritto completamente il programma cancellando l'altro per evitare di essere influenzato.
Schema:
Rispetto al precedente Schema è cambiato:
-configurazione dei pin 8-9 (causa riprogrammazione da zero)
-Il filo del segnale anziché andare sul pin digitale 10 va sull'ingresso analogico A0
-la resistenza R1 è diventata da 100 ohm per permettere al mio dito di interporsi agevolmente tra i due sensori
Il programmino lo posto lo stesso per i più curiosi ed ho fatto tutti i commenti in modo che sia leggibile da tutti:
//
//Barriera Infrarossi
//
// Definizione Varibili
byte Rpin=A0; //pin Ricevitore IR
int Rr; //Variabile reale
int Rd; //Variabile definita
byte R; //Variabile stato logico Ricevitore
byte Epin=8; //pin Emettitore IR
byte E; //Variabile stato logico Emettitore
byte L=9; //pin LED Segnalazione
byte Y; //Variabile per entrare uscire dal blink
long clk=1; //Lunghezza Ciclo
long M=0;
unsigned long T=millis();
//Loop setup eseguito una sola volta
void setup(){
// Definizione pin
pinMode(Epin,OUTPUT);
pinMode(L,OUTPUT);
//Definisco Rd Come valore di soglia HIGH LOW
digitalWrite (Epin,HIGH); //Accendo emettitore
Rd = analogRead(Rpin) +30; //Leggo la misura e +30 per star tranquilli
digitalWrite (Epin,LOW); //Spengo l'Emettitore
digitalWrite (L,LOW); //per sicurezza spengo il led
}
//Funzione blink ALLARME
void blink(){
if(Y==1){ //si attiva solo se Y=1
for( byte t=0 ; t < 6; t++){ //Fino a che t raggiunge 6 ovvero 6 lampeggi
digitalWrite(L,HIGH);
delay(250);
digitalWrite(L,LOW);
delay(250);
}
Y=0; //Y=0 per uscire dal ciclo
}
}
//Sketch
void loop(){
while (T-M <= clk){ //Esegue loop finché T-M diventa più grande di clk
T=millis(); //Essenziale per aggiornare la condizione while ed uscire dal ciclo
digitalWrite(Epin,HIGH); //Emettitore Acceso
E = 1; //Valore Logico 1
Rr = analogRead (Rpin); //Lettura Ricevitore
if (Rr < Rd) //Se Valore letto dal sensore è minore
R = 1; //Nessun Ostacolo
else
R = 0; //Presenza Ostacolo
if(E == R) //Se Emettitore emette e ricevitore riceve
digitalWrite(L,LOW); //Nessun Allarme
else
Y=1; //per entrare nel ciclo blink
blink(); //Allarme
}
while (T-M <= clk*2){ //Esegue loop finché T-M diventa più grande di clk*2
T=millis(); //Essenziale per aggiornare la condizione while ed uscire dal ciclo
digitalWrite(Epin,LOW); //Emettitore Spento
E = 0; //Valore Logico 0
Rr = analogRead (Rpin); //Lettura Ricevitore
if (Rr > Rd) //Se Valore letto dal sensore è minore
R = 0; //Barriera Spenta
else
R = 1; //Presenza Seganle IR Esterno
if(E == R) //Se Emettitore emette e ricevitore riceve
digitalWrite(L,LOW); //Nessun Allarme
else
Y=1; //per entrare nel ciclo blink
blink(); //Allarme
}
M=T; //"Azzera" il contatore
}
Ho provato a sistemare la tabulazione dei commenti ma non ci sono riuscito.
Diciamo che questo programma e la base dopo si può modificare aggiungendo altri cicli con temporizzazioni diverse per codificare ancora meglio il segnale tra Emettitore e Ricevitore io non l'ho fatto perché al momento non ho intenzione di realizzarne una

Bene ora posso concludere la relazione (alla fine di ogni progetto ne faccio...una è una rottura di scatole ma almeno se riprendo in mano qualche progetto tra qualche anno non divento scemo) e poi passare alla decodifica dei codici inviati dai telecomandi ma prima devo sistemare la scrivania che è un campo di battaglia.
Grazie dell'aiuto
