Pulsante normalmente aperto e codice non funziona

Ciao a tutti, sto sviluppando un progetto per cui quando premo un pulsante si accendono dei led animati e quando lo rilascio si spengono(dopo un tempo preimpostato), fintanto che avevo il pulsante normalmente chiuso, usando il pulsante in pullup lo tenevo in LOW tutto funzionava a meraviglia, ora lo sto usando con un pulsante normalmente aperto e sostituendo LOW con HIGH le luci sono sempre attive sia se prema il pulsante sia che non lo prema, cosa potrebbe essere?

Ecco il codice:

#include <FastLED.h>

#define NUM_LEDS 68
#define DATA_PIN 7


const int RITARDO = 3300;
unsigned long t = millis();
CRGB leds[NUM_LEDS];

void setup()
{
 Serial.begin(57600);
 LEDS.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
 LEDS.setBrightness(84);
 pinMode (6, INPUT_PULLUP);
}

void fadeall()
{
 for (int i=0; i<NUM_LEDS; i++) 
   {leds[i].nscale8(250);}
}

void loop()
{
 if (!digitalRead(6)) t=millis();
 if (digitalRead(6)==HIGH || millis()-t<RITARDO)
 {
   static uint8_t hue = 0;
   Serial.print('x');
   for (int i=0; i<NUM_LEDS; i++)
   {
     leds[i] = CHSV(hue++, 255, 255);
     FastLED.show();
     fadeall();
     delay(5);
   }
 }
 else
 {
   static uint8_t hue = 0;
   Serial.print('x');
   for (int i=0; i<NUM_LEDS; i++)
   {
     leds[i] = CHSV(hue++, 0, 0);
     FastLED.show();
     fadeall();
     delay(5);
   }
 }
 }

Quando il pulsante viene premuto e si chiude il contatto, il pin a cosa viene collegato? A GND o a Vcc?

Perché la pull-up ti tiene il pin sempre HIGH e quindi, se vuoi rilevare la chiusura devi fare si che esso chiuda verso GND e leggere quando il pin va da HIGH (condizione di NON premuto) a LOW (condizione di premuto).

Guglielmo

su GND

... e allora, come ti ho spiegato, il pulsante è SEMPRE HIGH (grazie alla pull-up) e va a LOW quando viene premuto ... quindi ... modifica il programma in tal senso.

Guglielmo

Si ma è quello che ho fatto, in pratica col pulsante normalmente chiuso e la riga di sketch:

if (digitalRead(6)==LOW || millis()-t<RITARDO)

quando premo il tasto l'animazione funziona e quando lo rilascio smette

mentre con il pulsante normalmente aperto e la riga di sketch:

if (digitalRead(6)==HIGH || millis()-t<RITARDO)

l'animazione resta sempre attiva, sia se premo il pulsante sia che lo rilascio

Devi cambiare anche la prima riga del loop.

Ci sono altre cose incongruenti... se il pulsante normalmente aperto chiude verso GND allora la condizione premuto è ==LOW, non ==HIGH (e viceversa per pulsante normalmente chiuso).

Oltre a questo non sono gestiti tutti gli stati, per cui la condizione con il timeout ritorna vera "da sola" per tre secondi ogni 1192 ore, anche senza premere il pulsante. Servirebbe almeno un'altra variabile flag per tenere conto se siamo in stato di fermo o di attivo (variabile che si alza quando si preme, e si abbassa quando avviene il timeout). A questo punto la sequenza deve avvenire semplicemente quando la variabile flag è alta.

Ma è un pulsante che mantiene la posizione oppure che ritorna alla pos precedente quando lo lasci?

Faresti meglio installando la libreria JC_Button.

Ciao.

Grande! ho levato il not e tutto funziona!
Grazie

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.