Buonasera a tutti. Ho acquistato un orologio digitale da parete LIDL molto carino unica pecca non regola l'intensità luminosa in funzione di quella ambiente, quindi di notte fa molta luce.
Con i tastini presenti sull'orologio è possibile un dimmeraggio a due livelli, per cui punto stavo pensando di programmare un attiny che in funzione della luce ambiente - letta da una fotoresistenza - simuli la pressione del tasto. Che ne dite? E' possibile come sketch?
NB: assorbimento irrilevante.
Andrebbe verificata la tensione di funzionamento dell'orologio.
Sono due tasti diversi?
Grazie per la risposta. Sono due tastini diversi. Ho già utilizzato un codice simile, tuttavia la mia difficoltà (purtroppo non sono costante nell'utilizzo di Arduino e relativa programmazione) ora è quella di evitare che il codice giri all'infinito e quindi il tasto venga premuto in continuazione.
Se metto il codice nel setup gira una sola volta ma solo quando resetto. Se lo metto nel loop...ovviamente looppa. Quindi a me serve questa logica:
- leggo valore illuminazione;
- se c'è poca luce, premo il tasto A due volte;
- mi fermo;
- quando torna la luce premo B due volte;
- mi fermo.
...e cosi via.
Non riesco ad utilizzare il while..
Il "problema" è sempre lo stesso: disabilitare un condizione tramite un flag una volta che la condizione viene trovata vera.
if (condizione1 && flag==0) {
...fai cose...
flag = 1;
}
if (condizione2 && flag==1) {
...fai cose...
flag = 0;
}
Grazie Claudio, come avrai visto sono presente sul forum da abbastanza tempo tuttavia mancandomi alcune basi teoriche, fatico, ogni volta che mi accingo a scrivere un codice a recepire alcuni concetti. Questo del flag è uno di quelli. Studio un pò ...prima che il buon Gug mi tiri le orecchie come al solito.
Il flag è uno stato...giusto? ...quindi deve leggere uno stato da qualche parte...
ecco il mio pastrocchio...SEMBRA funzionare...unico "bug" quando accendo/resetto, il codice gira partendo, ovviamente dalla prima condizione (luce), se invece simulo la condizione buio, il codice non parte finchè non gli do luce. In teoria dovrebbe automaticamente riconoscere la presenza o meno di luce...dove sbaglio?
int analogInPin = A0;
int sensorValue = 0;
int ledR = 5;
int ledV = 3;
byte test = 0;
void setup() {
Serial.begin(9600);
pinMode(analogInPin, INPUT);
pinMode(ledR, OUTPUT);
pinMode(ledV, OUTPUT);
pinMode(7, OUTPUT); // pin 7 OUTPUT
}
void loop() {
int time = (500);
sensorValue = analogRead(analogInPin);
if ((sensorValue>500) && test==0) { // ...fai...
digitalWrite(ledR, LOW);
digitalWrite(ledV, HIGH);
digitalWrite(7, HIGH); // punto di partenza
delay(time); // attendi tempo
digitalWrite(7, LOW); // premi tasto una volta. Verificare che tipo di impulso è necessario
delay(time); // attendi tempo
digitalWrite(7, HIGH); // rilascia tasto
delay(time); // attendi tempo
digitalWrite(7, LOW); // premi tasto seconda volta
delay(time); // attendi tempo
digitalWrite(7, HIGH); // rilascia tasto
test=1;
}
if (sensorValue<450 && test==1) { // ...fai cose...
digitalWrite(ledV, LOW);
digitalWrite(ledR, HIGH);
digitalWrite(7, HIGH); // punto di partenza
delay(time); // attendi tempo
digitalWrite(7, LOW); // premi tasto una volta. Verificare che tipo di impulso è necessario
delay(time); // attendi tempo
digitalWrite(7, HIGH); // rilascia tasto
delay(time); // attendi tempo
digitalWrite(7, LOW); // premi tasto seconda volta
delay(time); // attendi tempo
digitalWrite(7, HIGH); // rilascia tasto
test = 0;
}
Serial.print("sensor = ");
Serial.println(sensorValue);
//delay(800);
}
In condizioni di buio vuole test==1!
Sto ancora aggiustando i valori numerici.
Però non ho compreso il: test==1!
Inizialmente test vale 0, perciò al buio non può accadere nulla.
ok grazie. Ho provato e credo di aver capito. Quindi come ne esco per far riconoscere al codice la condizione di luce a prescindere?
Forse devo usare switch case?
Sto dicendo che, se nel setup test vale 0,
if (sensorValue<450 && test==1)
non può essere vera.
Cerco di seguirti...ma fatico. Praticamente ho due condizioni. Setto la condizione di partenza uguale 0.
Poi nei due casi, unitamente al valore luce, la comparo. Se è uguale (==) 0 in un caso ed uguale (==) ad 1 nell'altro esegue l'altro blocco. Dove mi sto perdendo?
Per fare quelle cose se la luminosità è bassa, test deve essere UGUALE A 1! Ma all'inizio del programma è scritto:
byte test = 0;
Allora come può fare quelle cose, appena acceso, se la luminosità è bassa???...
Inoltre, vedo che attivi sempre e solo l'uscita 7, mentre dovrebbero essere due tasti diversi.
Prova così:
#define analogInPin A0 // Ho corretto.
uint16_t lettSensore = 0;
#define ledR 5
#define ledV 3
#define BUIO 1
#define LUCE 2
uint8_t stato=0;
uint8_t stato_prec=0;
void setup()
{
pinMode (analogInPin, INPUT);
pinMode (ledR, OUTPUT); // Resistenza e LED R verso massa.
pinMode (ledV, OUTPUT); // Resistenza e LED V verso massa.
pinMode (7, OUTPUT); // pin 7 diminuisce la luminosità.
pinMode (8, OUTPUT); // pin 8 aumenta la luminosità.
digitalWrite(7, HIGH); // Alto a riposo.
digitalWrite(8, HIGH); // Alto a riposo.
}
void loop()
{
lettSensore = analogRead (analogInPin);
if (lettSensore>=600) stato=LUCE;
else (lettSensore<=400) stato=BUIO;
if(stato!=stato_prec)
{
if(stato==BUIO)
{
diminuisci_lum();
}
else // LUCE
{
aumenta_lum();
}
stato_prec=stato;
}
}
void diminuisci_lum()
{
digitalWrite(ledV, HIGH); // Accendi LED V.
digitalWrite(7, LOW); // Premi -.
delay(200);
digitalWrite(7, HIGH); // Lascia.
delay(500); // Pausa.
digitalWrite(7, LOW); // Premi -.
delay(200);
digitalWrite(7, HIGH); // Lascia.
digitalWrite(ledV, LOW); // Spegni LED V.
}
void aumenta_lum()
{
digitalWrite(ledR, HIGH); // Accendi LED R.
digitalWrite(8, LOW); // Premi +. (Ho corretto)
delay(200);
digitalWrite(8, HIGH); // Lascia.
delay(500); // Pausa.
digitalWrite(8, LOW); // Premi +. (Ho corretto)
delay(200);
digitalWrite(8, HIGH); // Lascia.
digitalWrite(ledR, LOW); // Spegni LED R.
}
Buongiorno, ho capito quanto dicevi per la variabile. Grazie. Ecco il codice aggiustato e funzionante
//#define analogInPin = A0
#define analogInPin A0
uint16_t lettSensore = 0;
int ledR = 5;
int ledV = 3;
#define BUIO 1
#define LUCE 2
uint8_t stato = 0;
uint8_t stato_prec = 0;
void setup() {
Serial.begin(9600);
pinMode(analogInPin, INPUT);
pinMode(ledR, OUTPUT); // Resistenza e LED R verso massa.
pinMode(ledV, OUTPUT); // Resistenza e LED V verso massa.
pinMode(7, OUTPUT); // pin 7 diminuisce la luminosità.
pinMode(8, OUTPUT); // pin 8 aumenta la luminosità.
digitalWrite(7, HIGH); // Alto a riposo.
digitalWrite(8, HIGH); // Alto a riposo.
}
void loop()
{
lettSensore = analogRead(analogInPin);
if (lettSensore>=500) stato=LUCE;
// else (lettSensore<=500) stato=BUIO;
else if (lettSensore <= 500) stato = BUIO;
if(stato!=stato_prec)
{
if(stato==BUIO)
{
diminuisci_lum();
}
else //
{
aumenta_lum();
}
stato_prec=stato;
}
Serial.print("sensor = ");
Serial.println(lettSensore);
}
void diminuisci_lum() {
digitalWrite(ledR, LOW); // Spegni LED R.
digitalWrite(ledV, HIGH); // Accendi LED V.
digitalWrite(7, LOW); // Premi -.
delay(200);
digitalWrite(7, HIGH); // Lascia.
delay(500); // Pausa.
digitalWrite(7, LOW); // Premi -.
delay(200);
digitalWrite(7, HIGH); // Lascia.
digitalWrite(ledR, LOW); // Spegni LED V.
}
void aumenta_lum() {
digitalWrite(ledV, LOW); // Spegni LED R.
digitalWrite(ledR, HIGH); // Accendi LED R.
digitalWrite(8, LOW); // Premi -.
delay(200);
digitalWrite(8, HIGH); // Lascia.
delay(500); // Pausa.
digitalWrite(8, LOW); // Premi -.
delay(200);
digitalWrite(8, HIGH); // Lascia.
//digitalWrite(ledV, LOW); // Spegni LED R.
}
Sarebbe buona norma lasciare un po' di isteresi...:
if (lettSensore>=500) stato=LUCE;
else if (lettSensore <= 450) stato = BUIO;
Si certamente. Al momento i valori, i pin e la presenza dei led che vedi nel codice sono solo a scopo di test. Grazie. Mi puoi sinteticamente spiegare questa linea di codice?
if(stato!=stato_prec)
Ho provato ad ottenere lo stesso effetto con lo switch case. Riconosce lo stato luce/buio a seconda dei valori e pensavo che con il break si interrompesse una volta effettuato il comando, invece (ovviamente) leggendo il valore continuamente va in loop. Esiste, in quel caso la possibilità di bloccare l'azione allo stato voluto?...non so se mi spiego. Ecco il codice (non far caso ai valori)
int analogInPin = A0;
int sensorValue = 0;
int ledR = 5;
int ledV = 3;
void setup() {
Serial.begin(9600);
pinMode(analogInPin, INPUT);
pinMode(ledR, OUTPUT);
pinMode(ledV, OUTPUT);
pinMode(7, OUTPUT); // pin 7 OUTPUT
pinMode(8, OUTPUT);
}
void loop() {
int time = (500);
sensorValue = analogRead(analogInPin);
switch (sensorValue) { // buio
case 0 ... 450:
{
digitalWrite(ledR, LOW);
digitalWrite(ledV, HIGH);
digitalWrite(7, HIGH); // punto di partenza
delay(time); // attendi tempo
digitalWrite(7, LOW); // premi tasto una volta. Verificare che tipo di impulso è necessario
delay(time); // attendi tempo
digitalWrite(7, HIGH); // rilascia tasto
delay(time); // attendi tempo
digitalWrite(7, LOW); // premi tasto seconda volta
delay(time); // attendi tempo
digitalWrite(7, HIGH); // rilascia tasto
}
break;
case 500 ... 750:
{
digitalWrite(ledV, LOW);
digitalWrite(ledR, HIGH);
digitalWrite(8, HIGH); // punto di partenza
delay(time); // attendi tempo
digitalWrite(8, LOW); // premi tasto una volta. Verificare che tipo di impulso è necessario
delay(time); // attendi tempo
digitalWrite(8, HIGH); // rilascia tasto
delay(time); // attendi tempo
digitalWrite(8, LOW); // premi tasto seconda volta
delay(time); // attendi tempo
digitalWrite(8, HIGH); // rilascia tasto
}
break;
}
Serial.print("sensor = ");
Serial.println(sensorValue);
delay(800);
}
Se lo stato è cambiato...
Grazie. Nel frattempo ho modificato il post cui avevi risposto. Pensavo di averlo inviato invece era rimasto appeso.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.