/* TEMPORIZZATORE Alla pressione di BUTTON1 LED1 si accende per spegnersi dopo TempoON */ # define BUTTON1 2 # define LED1 8 int buttonState1 = 0; unsigned long iMillis1 = 0; byte acceso1 = LOW; int TempoON = 3000; void setup() { pinMode(LED1, OUTPUT); pinMode(BUTTON1, INPUT); } void loop() { int buttonState1 = digitalRead(BUTTON1); if ( buttonState1 == HIGH && acceso1 == LOW) { digitalWrite(LED1, HIGH); acceso1 = HIGH; iMillis1 = millis(); } if ( acceso1 == HIGH && (millis()-iMillis1)> TempoON) { digitalWrite(LED1, LOW); acceso1 = LOW; } }//-------------Fine LOOP-------------
Visualizzazione post con etichetta OK. Mostra tutti i post
Visualizzazione post con etichetta OK. Mostra tutti i post
lunedì 24 novembre 2014
Temporizzatore ad impulso.
Temporizzatore ritardato all'inserzione (pulsante).
/* Il LED si accende dopo 5 sec. dalla pressione del pulsante e si spegne dopo 8 secondi dalla stessa pressione. */ # define TASTOSET 2 # define LED 7 int ValueLED = 0; int tempoON = 5000; byte acceso = LOW; int tempoOFF = 8000; byte acceso1 = LOW; unsigned long iMillis = 0; void setup() { pinMode(TASTOSET, INPUT ); pinMode(LED, OUTPUT); } void loop() { int valoreTastoSET = digitalRead(TASTOSET); if ( valoreTastoSET == HIGH) { acceso = HIGH; acceso1 = HIGH; iMillis = millis(); digitalWrite(LED, LOW);} if ( acceso == HIGH && (millis()-iMillis)> tempoON) { digitalWrite(LED, HIGH); acceso = LOW; } if ( acceso1 == HIGH && (millis()-iMillis)> tempoOFF) { digitalWrite(LED, LOW); acceso1 = LOW; } }
domenica 23 novembre 2014
Temporizzatore con ritardo all'inserzione.
# define LED1 8 # define SWITCH1 2 int switch1State = LOW; byte pState1 = 0; unsigned long pMillis1 = 0; unsigned long pausa1 =3000; void setup() { pinMode(LED1, OUTPUT); pinMode(SWITCH1, INPUT); } void loop(){ switch1State = digitalRead(SWITCH1); if (switch1State == HIGH) { if ( millis() - pMillis1 > pausa1) { pMillis1 = millis(); pState1 = HIGH; digitalWrite(LED1, pState1);}} }
giovedì 20 novembre 2014
Delay 2
I due led lampeggiano alla stessa frequenza con tempi di ON ed OFF uguali.
Vedi anche i post " delay 1" e " Blink senza delay".
Vedi anche i post " delay 1" e " Blink senza delay".
/* La pausa inserita nel ciclo di BUTTON1 non influisce sull'azione di BUTTON2 */ const int BUTTON1 = 2; const int LED1 = 12; int buttonState1 = 0; const int BUTTON2 = 3; const int LED2 = 13; int buttonState2 = 0; long pMillis = 0; long interval = 10000; void setup() { pinMode(BUTTON1, INPUT); pinMode(BUTTON2, INPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); } void loop(){ buttonState1 = digitalRead(BUTTON1); if ( buttonState1 == HIGH) { unsigned long cMillis = millis(); if ( cMillis - pMillis > interval) { pMillis = cMillis; digitalWrite( LED1, HIGH); } else { LED1, LOW;}} buttonState2 = digitalRead(BUTTON2); if ( buttonState2 == HIGH) { digitalWrite(LED2, HIGH); } else { digitalWrite(LED2, LOW); } }
Delay 1
/* Mentre BUTTON1 è a livello HIGH per 10 sec. tutto il LOOP è bloccato, infatti BUTTON2 non riesce ad accendere LED2 */ const int BUTTON1 = 2; const int LED1 = 12; int buttonState1 = 0; const int BUTTON2 = 3; const int LED2 = 13; int buttonState2 = 0; long pMillis = 0; long interval = 10000; void setup() { pinMode(BUTTON1, INPUT); pinMode(BUTTON2, INPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); } void loop(){ buttonState1 = digitalRead(BUTTON1); if ( buttonState1 == HIGH) { digitalWrite(LED1, HIGH); delay (10000); } else { digitalWrite(LED1, LOW); } buttonState2 = digitalRead(BUTTON2); if ( buttonState2 == HIGH) { digitalWrite(LED2, HIGH); } else { digitalWrite(LED2, LOW); } }
venerdì 14 novembre 2014
Blink with delay asimmetrico.
Alla chiusura di un interruttore due led lampeggiano ciascuno con tempi propri di ON ed OFF senza l'uso dell'istruzione delay()
# define BUTTON1 2 # define BUTTON2 3 # define LED1 6 # define LED2 7 int buttonState1 = 0; byte Pulse1 = 0; unsigned long pMillis1A = 0; unsigned long Wart1A = 100; unsigned long pMillis1B = 0; unsigned long Wart1B = 1200; int buttonState2 = 0; byte Pulse2 = 0; unsigned long pMillis2A = 0; unsigned long Wart2A = 330; unsigned long pMillis2B = 0; unsigned long Wart2B = 660; void setup() { pinMode(BUTTON1,INPUT); pinMode(BUTTON2,INPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); } void loop() { buttonState1 = digitalRead(BUTTON1); if ( buttonState1 == HIGH) { if ( millis() - pMillis1A > Wart1A) { pMillis1A = millis(); Pulse1 = LOW; digitalWrite(LED1, Pulse1); if ( millis() - pMillis1B > Wart1B) { pMillis1B = millis(); Pulse1 = HIGH; digitalWrite(LED1, Pulse1); }}} buttonState2 = digitalRead(BUTTON2); if ( buttonState2 == HIGH) { if ( millis() - pMillis2A > Wart2A) { pMillis2A = millis(); Pulse2 = LOW; digitalWrite(LED2, Pulse2); if ( millis() - pMillis2B > Wart2B) { pMillis2B = millis(); Pulse2 = HIGH; digitalWrite(LED2, Pulse2); }}} }
Encoder
Perchè mai debbo complicarmi la vita usando un encoder rotativo?
Se devo impostare un valore posso usare un comune potenziometro o due pulsanti UP e DOWN.
Di seguito un listato. Necessita di due resistense da 10Kohm fra + Vcc ed i pin dell'encoder.
Nello sketch non c'è, ma ci vuole perchè è pur sempre un dispositivo meccanico, l'antirimbalzo.
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 10, 11, 12, 13); int encoderPin1 = 2; int encoderPin2 = 3; int ledPin1 = 5; volatile int lastEncoded = 0; volatile long encoderValue = 0; long lastencoderValue = 0; int lastMSB = 0; int lastLSB = 0; void setup() { pinMode(encoderPin1, INPUT); pinMode(encoderPin2, INPUT); pinMode(ledPin1, OUTPUT); digitalWrite(encoderPin1, HIGH); digitalWrite(encoderPin2, HIGH); analogWrite (ledPin1,LOW); attachInterrupt(0, updateEncoder, CHANGE); attachInterrupt(1, updateEncoder, CHANGE); lcd.begin(16, 2); Serial.begin (9600); } void loop(){ // delay(200); Serial.println(encoderValue); lcd.setCursor(0, 0); lcd.print(encoderValue); if ( encoderValue > 255 ) { encoderValue = 255; lcd.clear(); delay (20); } if ( encoderValue < 0 ) { encoderValue = 0; lcd.clear(); delay(20);} analogWrite(ledPin1,encoderValue); Serial.println(encoderValue); } //--------------- Fine LOOP------------------- void updateEncoder(){ int MSB = digitalRead(encoderPin1); int LSB = digitalRead(encoderPin2); int encoded = (MSB << 1) |LSB; int sum = (lastEncoded << 2) | encoded; if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; lastEncoded = encoded; }
lunedì 10 novembre 2014
Contapezzi
/* Impostare il valore con il potenziometro. Quando il numero di impulsi su Pin2 è uguale al valore impostato il relè si eccita. Fornito di antirimalzo. Il conteggio avanza sulo sul fronte di salita,ovvero non avanza se su pin2 permane in HIGH.Il valore impostato viene diviso per 10 per avere un fondoscala di 123. */ #include <LiquidCrystal.h> LiquidCrystal lcd( 8, 9, 10, 11, 12, 13); # define IMPOSTA A0 # define CONTA 3 # define RELE 5 # define RELE1 6 # define AZZERA 4 long ValueImposta = 0; long ValueImposta1 = 0; int ValueConta = 0; int lastValueConta = 0; byte contaImpulsi = 0; byte Merker = 0; void setup() { pinMode(IMPOSTA, INPUT ); pinMode(CONTA, INPUT ); pinMode(RELE, OUTPUT ); pinMode(RELE1, OUTPUT ); lcd.begin(16, 2); Serial.begin(9600); } void loop() { lcd.setCursor(0,0); lcd.print ("V.Impostato"); lcd.setCursor(0,1); lcd.print ("V.Contato"); //-------- Imposta il n. max di pezzi ------------ ValueImposta=analogRead(IMPOSTA); ValueImposta1 = (ValueImposta / 10); lcd.setCursor(13,0); lcd.print(ValueImposta1); //---------- Leggi pezzi su Pin2 ------------------- ValueConta = digitalRead(CONTA); if ( ValueConta != lastValueConta) { if ( ValueConta == HIGH) { contaImpulsi = contaImpulsi + 1; lcd.setCursor(13, 1); lcd.print(contaImpulsi); Serial.println(contaImpulsi); delay(20); }}// DebounceTime lastValueConta = ValueConta; /*---- -----CONFRONTO FRA I DUE DATI -------- arrivato al valore impostato il relè si eccita per mezzo secondo, il conteggio si azzera per poi reiniziare*/ if ( ValueImposta1 == contaImpulsi) { digitalWrite(RELE, HIGH); Serial.println("RELE ON"); Merker = HIGH; delay(500); contaImpulsi = 0; digitalWrite(RELE, LOW); Merker = LOW; lcd.clear(); delay(30); } /*------------ Esegui un'altra azione----------- La variabile Merker può essere usata per eseguire altre azioni. */ if ( Merker == HIGH) { digitalWrite(RELE1, HIGH); } }
sabato 25 ottobre 2014
CRONOMETRO HIGH/LOW
Lo sketch permette di cronometrare il tempo di ON e di OFF di un onda quadra.
/* Cronómetro modificato, creado por Javier Sirgo Blanco http://zygzax.com/webpcronometro/ Ingresso al pin 2. Misura il tempo di ON e di OFF di un segnale ad onda quadra. I due tempi si azzerano al reinizio del ciclo. */ #include <LiquidCrystal.h> # define SET 2 LiquidCrystal lcd(8, 9, 10, 11, 12, 13); int m, mu=0,md=0; int s, su=0,sd=0; int l, lu=0,ld=0,lc=0; int pin2; long int tempo,inizio; void setup() { pinMode(SET, INPUT); pin2=LOW; lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("ON"); lcd.setCursor(5, 0); lcd.print("00:00:000"); lcd.setCursor(0, 1); lcd.print("OFF"); lcd.setCursor(5, 1); lcd.print("00:00:000"); } void loop() { //**************** Tempo in cui il pin 2 è HIGH ******************** pin2=digitalRead(2); if ( pin2==HIGH) { inizio=millis(); //Cronometra e trasforma in sessagesimali il tempo di ON while (pin2==HIGH) { tempo=millis()-inizio; m=(tempo/1000)/60; mu=m%10; md=(m-mu)/10; s=(tempo/1000)%60; su=s%10; sd=(s-su)/10; l=(tempo%1000); lu=l%10; ld=((l-lu)/10)%10; lc=(l-(ld*10)-lu)/100; // Stampa sulla prima riga il tempo di ON lcd.setCursor(5, 0); lcd.print(md); lcd.print(mu); lcd.print(":"); lcd.print(sd); lcd.print(su); lcd.print(":"); lcd.print(lc); lcd.print(ld); lcd.print(lu); pin2=digitalRead(SET); } } // Fine sottoprogramma tempo di HIGH //**************** Tempo in cui il pin 2 è LOW ******************** pin2=digitalRead(2); if ( pin2==LOW) { inizio=millis(); //Cronometra e trasforma in sessagesimali il tempo di OFF while( pin2==LOW) { tempo=millis()-inizio; m=(tempo/1000)/60; mu=m%10; md=(m-mu)/10; s=(tempo/1000)%60; su=s%10; sd=(s-su)/10; l=(tempo%1000); lu=l%10; ld=((l-lu)/10)%10; lc=(l-(ld*10)-lu)/100; // Stampa sulla seconda riga il tempo di OFF lcd.setCursor(5, 1); lcd.print(md); lcd.print(mu); lcd.print(":"); lcd.print(sd); lcd.print(su); lcd.print(":"); lcd.print(lc); lcd.print(ld); lcd.print(lu); pin2=digitalRead(SET); }} // Fine sottoprogramma tempo di LOW }//----------Fine Programma
Iscriviti a:
Post (Atom)




