Ciao a tutti avrei bisogno del vostro prezioso aiuto, ho questo circuito che dovrebbe fare questo:
- premo contemporaneamente i due pulsanti per 2/3 sec. si alimenta va in auto ritenuta e passa allo stato ON rimanendo alimentato,
• in questo stato si accende il led RGB e facendo lo spettro colori mi dà lo stato di carica della batteria,
• sempre nello stato ON il pulsante 1 accende e spegne il led 1 e il pulsante 2 accende e spegne il led 2 - se ripremo i due pulsante contemporaneamente per 2/3 sec. si toglie auto ritenuta e si spegne il tutto
cosa vorrei migliorare e non so come fare, - avvenuto lo stato ON i pulsanti 1 e 2 dovrebbero avere un debounce variabile sia in accensione che in spegnimento, spiegandomi meglio faccio un esempio, vorrei poter accendere subito e spegnere dopo una pressione di 3sec il led 1 con il pulsante 1 e così anche il pulsante 2 magari accendo dopo pressione di 3sec. e spengo dopo altra pressione o subito, io ci ho provato ma non riesco ad avere ON o OFF in real time
- Altra cosa ma magari va messa prima vorrei che le uscite non siano attive prima di passare allo stato ON
mi aiutate per favore, Grazie
/*
per programmare attiny84 in circuit è stato aggiunto connettore 6 cpin con questi collegamenti
pin 1 - Vcc 5v
pin 2 - su attiny84 pin 4 su arduino pin 10
pin 3 - su attiny84 pin 7 su arduino pin 11
pin 4 - su attiny84 pin 8 su arduino pin 12
pin 5 - su attiny84 pin 9 su arduino pin 13
pin 6 - GND
*/
#define PIN_RITENUTA 11 //su attiny84 pin fisico 10
#define PIN_PULS1 2 //su attiny84 pin fisico 6
#define PIN_PULS2 3 //su attiny84 pin fisico 7
#define led1 7 //su attiny84 pin fisico 2
#define led2 8 //su attiny84 pin fisico 8
int led1_state = HIGH;
int led2_state = HIGH;
byte rilasciato = 0;
unsigned long t = 0;
byte prem1Prec = 0;
byte prem2Prec = 0;
int S = 0;
// Button states and debounce
int buttonState1 = 0;
int buttonState2 = 0;
int lastButtonState1 = LOW;
int lastButtonState2 = LOW;
unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
// Arduino
#define sensorPin A2 //su attiny84 pin fisico 11
int ledRPin = 5; //RED LED su attiny84 pin fisico 3
int ledGPin = 6; //GREEN LED su attiny84 pin fisico 12
int ledBPin = 4; //BLUE LED su attiny84 pin fisico 13
int u = 0; // variable to store the value coming from the sensor
int um = 0; // sum
int numero = 0; // number
float u0, u1, ux;
float k0 = 1.016; // correction for resistive divider
float k=(float)4.88/5.; // corection voltage ("real 5V" / 5V)
// define voltage steps (step = 1023 * voltage_threshold /20)
/*
int step1 = 624; // Ubat=12,2V (100%)
int step2 = 593; // 95%
int step3 = 562; // 90%
int step4 = 499; // 80%
int step5 = 468; // 75%
*/
int step1 = 624; // Ubat=12,2V (100%)
int step2 = 0.95*step1; // 95%
int step3 = 0.9*step1; // 90%
int step4 = 0.8*step1; // 80%
int step5 = 0.75*step1; // 75%
int isteresi = 2; // per eliminare i cambiamenti veloci
int pausa = 500; // freno tra le misurazioni
int pausa2 = 300; // tempo in ms per il flash rosso (acceso/spento)
int letture = 50; // numero di misurazioni
// Coomon Anode
byte spento = 1;
byte acceso = 0;
/*
// Comon Cathode
byte spento = 0;
byte acceso = 1;
*/
void setup()
{
pinMode(led1, OUTPUT);
pinMode(PIN_PULS1, INPUT_PULLUP);
pinMode(led2, OUTPUT);
pinMode(PIN_PULS2, INPUT_PULLUP);
pinMode(PIN_RITENUTA, OUTPUT);
//digitalWrite(PIN_RITENUTA, 1);
Serial.begin(9600);
// declare the ledPins as an OUTPUT:
pinMode(ledRPin, OUTPUT);
pinMode(ledGPin, OUTPUT);
pinMode(ledBPin, OUTPUT);
digitalWrite(ledRPin, spento);
digitalWrite(ledGPin, spento);
digitalWrite(ledBPin, spento);
pinMode(sensorPin, INPUT);
}
void loop()
{
delay(40); // debounce barbaro minimo
// letture ingressi con riconoscimento
// click su rilascio
byte prem1 = (digitalRead(PIN_PULS1) == 0);
byte click1 = !prem1 && prem1Prec;
prem1Prec = prem1;
byte prem2 = (digitalRead(PIN_PULS2) == 0);
byte click2 = !prem2 && prem2Prec;
prem2Prec = prem2;
// Gestione autoritenuta
if(S==0 && prem1 && prem2)
{
if(millis() - t > 2000)
{
digitalWrite(PIN_RITENUTA, 1);
S = 1;
}
}
else if (S==1 && !prem1 && !prem2)
{
S = 2;
}
else if (S==2 && prem1 && prem2)
{
if(millis()-t> 2000)
{
digitalWrite(PIN_RITENUTA, 0);
}
}
else
{
t=millis();
}
int reading1 = digitalRead(PIN_PULS1);
if (reading1 != lastButtonState1)
lastDebounceTime1 = millis();
if ((millis() - lastDebounceTime1) > 500) {
if (reading1 != buttonState1) {
buttonState1 = reading1;
if (buttonState1 == LOW) {
led1_state = !led1_state;
}
}
}
lastButtonState1 = reading1;
digitalWrite(led1, led1_state);
int reading2 = digitalRead(PIN_PULS2);
if (reading2 != lastButtonState2)
lastDebounceTime2 = millis();
if ((millis() - lastDebounceTime2) > 500) {
if (reading2 != buttonState2) {
buttonState2 = reading2;
if (buttonState2 == LOW) {
led2_state = !led2_state;
}
}
}
lastButtonState2 = reading2;
digitalWrite(led2, led2_state);
if (S == 2)
{
powerON();
}
} // end main loop
void powerON()
{
/*
// all leds are off
digitalWrite(ledRPin, spento); // turn the red led off
digitalWrite(ledGPin, spento); // turn the green led off
digitalWrite(ledBPin, spento); // turn the blue led off
*/
// read the value from the sensor:
um = 0;
for (int i = 0; i < letture; i++)
{
u = (float)(k0 * k *analogRead(sensorPin));
delay(10);
um = um + u;
}
ux = (float)(um/letture);
u0 = (float)(ux * 5. / 1024); // voltage on uC pin
u1 = (float)(4. * u0 );
//Serial.print("step = ");
//Serial.print(u);
//Serial.print("/1024 = ");
//Serial.print(u1);
//Serial.println("V");
// voltage below 75% -> flash RED
if (u < step5)
{
digitalWrite(ledRPin, acceso);
digitalWrite(ledGPin, spento);
digitalWrite(ledBPin, spento);
//Serial.println("<75% = <9.2V ===> R");
delay(pausa2);
digitalWrite(ledRPin, spento);
digitalWrite(ledGPin, spento);
digitalWrite(ledBPin, spento);
delay(pausa2);
}
// voltage over 75% & below 80% -> YeLLOW (RED + GREEN)
if (u >= step5 && u < step4-isteresi)
{
digitalWrite(ledRPin, acceso);
digitalWrite(ledGPin, acceso);
digitalWrite(ledBPin, spento);
//Serial.println("75..80% = 9.2..9.8V ===> R+G");
delay(pausa);
}
// voltage over 80% & below 90% -> GREEN
if (u >= step4 && u < step3-isteresi)
{
digitalWrite(ledRPin, spento);
digitalWrite(ledGPin, acceso);
digitalWrite(ledBPin, spento);
//Serial.println("80..90% = 9.8..11.0V ===> G");
delay(pausa);
}
// voltage over 90% & below 95% -> CYAN (BLUE + GREEN)
if (u >= step3 && u < step2-isteresi)
{
digitalWrite(ledRPin, spento);
digitalWrite(ledGPin, acceso);
digitalWrite(ledBPin, acceso);
//Serial.println("90..95% = 11.0..11.6V ===> B+G");
delay(pausa);
}
// voltage over 95% & below 100% -> BLUE
if (u >= step2 && u <= step1-isteresi)
{
digitalWrite(ledRPin, spento);
digitalWrite(ledGPin, spento);
digitalWrite(ledBPin, acceso);
//Serial.println("95..100% = 11.6..12.2V ===> B");
delay(pausa);
}
// voltage over 12,2V (> 100%) -> MAUVE (RED + BLUE)
if (u > step1)
{
digitalWrite(ledRPin, acceso);
digitalWrite(ledGPin, spento);
digitalWrite(ledBPin, acceso);
//Serial.println(">100% = 12.2V ===> R+B");
/*
delay(300);
digitalWrite(ledRPin, spento);
digitalWrite(ledGPin, spento);
digitalWrite(ledBPin, spento);
*/
delay(pausa);
}
}