Go Down

Topic: simulazione pressione tasto con microcontroller (Read 7498 times) previous topic - next topic

vince59

...il chip è ripartito...ci sto smanettando un pò...adesso provo ad impostare i fuse. Ora che ho risolto ilproblema del caricbatterie posso dedicarmi a studiare e sperimentare.
e del caso approfitterò della tua disponibilità.

Devo capire bene i vari tipi di fuse a cosa servono e ...quanti ne sono :-)

gpb01

#31
Jul 17, 2016, 09:16 am Last Edit: Jul 17, 2016, 09:16 am by gpb01
Devo capire bene i vari tipi di fuse a cosa servono e ...quanti ne sono :-)
Usa il link che ti ho dato per il "calcolatore di fuse" ... e leggendo quello e quali sono relativi al ATtiny85, vai a vedere sul datasheet la spiegazione.

Guglielmo
Search is Your friend ... or I am Your enemy !

vince59

Buongiorno, tra una nuotata e l'altra continuo a studiare...questo mondo è davvero affascinante...
Il mio mini programmino (simulazione pressione tasto per due volte al collegamento del dispositivo alla 220) funziona bene ed ora vorrei aggiungere una funzione. Ricordo che si tratta di un caricabatterie che utilizzo in barca per caricare due batterie Il fatto è che ora devo spostare il morsetto manualmente da una batteria all'altra e vorrei automatizzare questa funzione.
Per far ciò vorrei utilizzare il segnale di batteria carica (accensione led verde del CB) per comandare un rele/transistor-rele per collegare il CB all'altra batteria e così via. La logica quindi sarebbe:
- collego il CB alla 220;
- il microcontrollore lo porta in modalità carica della batteria A;
- la batteria A si carica (si accende led verde);
- il microcontrollore legge l'accesione del led verde...pone il CB in stand-by (pressione del tasto una volta), attiva il rele di cambio batteria, preme il tasto due volte per attivare la carica della batteria B;
Ho scritto il codice per l'ATtiny utilizzando i Pin 0 ed 1 (PWM) per premere il tasto ed attivare il rele e vorrei utlizzare uno dei Pin analogici (3 o 4) del chip per leggere lo stato del tasto verde...
Scritta tutta sta storia ho difficoltà a far leggere lo stato del pin verde dal piedino analogico (ho provato il codice solo con dei led e simulato lo stato del pin verde acceso collegando il piedino 3 ai 5v di arduino).
Potete aiutarmi a comprendere dove sbaglio?

Etemenanki

Racchiudilo nei tag "code" , prima che Guglielmo ti sgridi ... ;)

Ricorda che se passi da una batteria all'altra, anche con un rele', che e' veloce, dovrai comunque mettere un bel condensatore all'ingresso di alimentazione del CB, in modo da "mantenere" l'alimentazione per quella frazione di secondo in cui scatta il rele' (da 4700uF in su, almeno 25V, va bene tutto) ... in alternativa, dovrai usare rele' "telefonici", ma e' diventato quasi impossibile trovarne ormai (nel caso te lo stessi chiedendo, nei deviatori dei rele "telefonici", al contrario dei normali rele', al momento dello scatto il contatto NC si apre solo DOPO che il contatto NA si e' chiuso, e viceversa, per garantire il mantenimento della connessione di linea)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

gpb01

#34
Aug 20, 2016, 12:20 pm Last Edit: Aug 20, 2016, 12:20 pm by gpb01
Racchiudilo nei tag "code" , prima che Guglielmo ti sgridi ... ;)
Esatto ! :D

@vince59: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo
Search is Your friend ... or I am Your enemy !

brunello22

e comunque c'è un errore


Code: [Select]
 if (greenLedStatus = HIGH){

vince59

Code: [Select]
// const int sensorPin = 4;
void setup() {             
  pinMode(0, OUTPUT);           // pin 0 PWM - piedino fisico 5 = comando tasto CB
  pinMode(1, OUTPUT);           // pin 1 PWM - piedino fisico 6 = comando rele
// pinMode(3, INPUT);
  int time = 600;
  digitalWrite(0, HIGH);        // punto di partenza
  delay(time);                  // attendi n secondi
  digitalWrite(0, LOW);         // PREMI TASTO PRIMA VOLTA - PIN 0 su LOW / ground
  delay(time);                  // attendi n secondi
  digitalWrite(0, HIGH);        // RILASCIA TASTO
  delay(time);                  // attendi n secondi
  digitalWrite(0, LOW);         // PREMI TASTO SECONDA VOLTA
  delay(time);                  // attendi n secondi
  digitalWrite(0, HIGH);        // RILASCIA TASTO
  digitalWrite(1, HIGH);
  }
void loop() {
// pinMode(0, OUTPUT);           // pin 0 PWM - piedino fisico 5 = comando tasto CB
// pinMode(1, OUTPUT);           // pin 1 PWM - piedino fisico 6 = comando rele
// pinMode(3,INPUT);
// int greenLedRead;
int sensorPin = 4;
int greenLedStatus = analogRead(sensorPin);
 // greenLedRead = analogRead(3); // pin 4 (analog input 2) = piedino fisico 3
 // if (greenLedRead > 0){
 float value = (greenLedStatus/1024.0)*5.0;
 //if (value = HIGH){
 if (greenLedStatus = HIGH){
 /*   int(time) = 500;
     delay(time);
     digitalWrite(0,HIGH);     // riportare il CB in stand-by
     delay(time);              // attendi n secondi
     digitalWrite(0, LOW);     // preme bottone CB in stand by    QUINDI SI SPEGNE IL LED VERDE
     delay (time);
     digitalWrite(1, HIGH);    // attiva relè cambio batteria
     delay(time);              // attendi n secondi
     digitalWrite(0, HIGH);    // posizione partenza
     delay(time);              // attendi n secondi
     digitalWrite(0, LOW);     // CB su 6 V
     delay(time);              // attendi n secondi
     digitalWrite(0, HIGH);    // RILASCIA TASTO
     delay(time);              // attendi n secondi
     digitalWrite(0, LOW);     // CB su 12 V
     delay (time);
     digitalWrite(0, HIGH);    // RILASCIA TASTO */
digitalWrite(0, LOW);
digitalWrite(1, HIGH);
delay(500);
digitalWrite(1, LOW);
delay(500);
digitalWrite(1, HIGH);
   }
  }

vince59

e comunque c'è un errore


Code: [Select]
if (greenLedStatus = HIGH){

..si il problema non è quello elettrico del collegamento rele o altro ma appunto il codice.
Adesso sto testando il codice sulla piastra...il loop if non sembra funzionare come si deve. Il mio approccio è quello di far leggere la tensione del led del carica batteria sull'input analogico ed utilizzarla appunto come input per pilotare in uscita il piedino dedicato al rele su HIGH.
Ho impostato correttamente la lettura del piedino analogico e corrispondente ciclo loop?

aster94

#38
Aug 20, 2016, 11:40 pm Last Edit: Aug 21, 2016, 12:08 am by aster94
Metti il doppio uguale e vedrai che funziona:

Code: [Select]
if (greenLedStatus == HIGH){

Cosí significa confronto, con uno solo é come se tu stessi assegnando lo stato



Usa l arduino reference, non condannare il genere umano!


P.S: quel codice con tutti quei commenti si capisce abbastanza poco usa di piú le variabili globali dandogli nomi chiari e facilmente comprensibili per tutti

P.s2: dai una bella pulita a quel codice e poi rispondimi: stai leggendo un valore analogico o digitale dal led verde? ;-)

vince59

grazie della risposta. sto pulendo il codice e ti risponderò in modo completo appena rientro a casa. Cmq sto leggendo direttamente l'accesnsione del led (tensione sul piedino positivo) desumo sia un segnale analogico...

vince59

ecco il codice ...spero più pulito.
Nel mio intento il ciclo setup avvia la carica della batteria A e quindi il ciclo loop verifica lo stato del led verde per passare la carica dalla batteria A a quella B. Il ciclo dovrebbe continuare a ripetersi passando da una batteria all'altra...però mi sembra che non funzioni come pensato. AL momento l'ho provato solo sulla breadboard

Code: [Select]
void setup() {
  pinMode(0, OUTPUT);           // pin 0 PWM - piedino fisico 5 = comando tasto CB
  pinMode(1, OUTPUT);           // pin 1 PWM - piedino fisico 6 = comando rele
  int time = 1000;
  digitalWrite(1, LOW);         // rele batteria OFF
  digitalWrite(0, HIGH);        // punto di partenza
  delay(time);                 
  digitalWrite(0, LOW);         // PREMI TASTO PRIMA VOLTA
  delay(time);                 
  digitalWrite(0, HIGH);        // RILASCIA TASTO
  delay(time);                 
  digitalWrite(0, LOW);         // PREMI TASTO SECONDA VOLTA CB carica la batteria A
  delay(time);                 
  digitalWrite(0, HIGH);        // RILASCIA TASTO
  //digitalWrite(1, LOW);       //
 }
void loop() {
// int sensorPin = 3;                       // pin 3 (analog input 3) - piedino fisico 2
// analogRead(3);                           // lettura del piedino positivo del led verde di fine carica 
int greenLedStatus = analogRead(3);         // variabile in cui immagazzinare la lettura
float value = (greenLedStatus/1024.0)*5.0;  // trasformazione del voltaggio rilevato in segnale
if (value == 0){                            // batteria A carica - led verde acceso
   int time = 2000;
     delay(time);
     digitalWrite(0,HIGH);     // ciclo per riportare il CB in stand-by
     delay(time);             
     digitalWrite(0, LOW);     // preme tasto - CB in stand-by QUINDI SI SPEGNE IL LED VERDE
     delay (time);
     digitalWrite(1, HIGH);    // ATTIVA RELE CAMBIO BATTERIA A --> B
     delay(time);             
     digitalWrite(0, HIGH);    // posizione partenza
     delay(time);             
     digitalWrite(0, LOW);     // preme tasto prima volta - CB su 6 V
     delay(time);             
     digitalWrite(0, HIGH);    // rilascia tasto
     delay(time);             
     digitalWrite(0, LOW);     // preme tasto seconda volta - CB sulla batteria B
     delay (time);
     digitalWrite(0, HIGH);    // rilascia tasto
       /*int sensorPin = 4;
       int greenLedStatusB = analogRead(sensorPin);
       float valueB = (greenLedStatusB/1024.0)*5.0; */
       /*if (value == 0) {        // batteria B carica - led verde acceso
       // if (analogRead == 0);
       delay(2000);
       digitalWrite(1, LOW);    // disattiva relè cambio batteria
       } */
    }
  }

gpb01

#41
Aug 28, 2016, 09:31 pm Last Edit: Aug 28, 2016, 09:31 pm by gpb01
Scordati di avere letture così precise da poter far confronti con l'operatore "==" ...
... devi definire un "intervallo" (es x < 100 per spento; x > 800 per acceso) così da evitare le normali variazioni del convertitore A/D.

Ma scusa, perché non ti semplifichi la vita ed usi una lettura digitale digitalRead(sensorPin); ? ? ? Se il valore che leggi sul pin è LOW vuol dire che il LED è ? ? ? acceso ? viceversa, se il valore che leggi è HIGH vuol dire che il LED è ? ? ? spento ? (spento o acceso devi vedere tu che cosa danno).

Guglielmo
Search is Your friend ... or I am Your enemy !

aster94

grazie della risposta. sto pulendo il codice e ti risponderò in modo completo appena rientro a casa. Cmq sto leggendo direttamente l'accesnsione del led (tensione sul piedino positivo) desumo sia un segnale analogico...
no, è un segnale digitale (vuol dire che è 0 o 1, acceso o spento) era quello che volevo capissi da solo, pertanto come dice gpb01 devi usare il digitalRead

vince59

#43
Aug 29, 2016, 08:50 am Last Edit: Aug 29, 2016, 09:01 am by vince59
Vi ringrazio veramente dell'attenzione che mi state dedicando. Purtroppo sto faticando a metabolizzare alcuni concetti...sfrutto anche l'ingegnere elettronico di casa ma porca miseria alcune cose ancora mi sfuggono.
Per me è stato un risultato già il solo far girare un codice così semplice e l'appetito viene mangiando.
Non inorridite di fronte a ciò che sto per scrivere...pensavo che su un piedino "analog input" fosse utilizzabile SOLO un analog read. Se così non fosse allora il problema della lettura dello stato del led (accesso/on - e spento/off corrispondente a attivà il rele o disattiva il rele) dovrebbe essere risolto.
Avete osservazioni sul ciclo loop che dovrebbe monitorare costantemente lo stato del led?

Aster hai ragione, ho inteso ora il senso della tua domanda e la risposta era ovvia.


Grazie ancora

gpb01

#44
Aug 29, 2016, 10:07 am Last Edit: Aug 29, 2016, 10:07 am by gpb01
....pensavo che su un piedino "analog input" fosse utilizzabile SOLO un analog read.
NO, ogni piedino analogico di Arduino UNO (quindi A0 .. A5) può essere utilizzato anche come normale piedino digitale con le solite funzioni ... pinMode(), digitalRead() e digitalWtite() :)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up