Neopixel e fotoresistenza

Buongiorno! Premetto che sono nuova della programmazione quindi potrebbe sfuggirmi qualcosa di estremamente semplice.
Il mio scopo è scrivere uno sketch per far sì che la mia striscia di led Neopixel si accenda quando c'è poca luce e il bottone aperto, si spenga quando il bottone è chiuso (ho usato la funzione pullup) e rimanga spenta in condizioni di luce superiori a un tot.
Ora, inizialmente ho scritto lo sketch per un semplice led e funziona, ma per i Neopixel proprio non riesco.
Allego il codice.Suggerimenti?
Grazie mille :slight_smile:

//prova codice con neopixel

#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel strip = Adafruit_NeoPixel(6, 12, NEO_GRB + NEO_KHZ800); //numero di led, pin

const int ldrPin=A1; //fotoresistenza
int val=0; //valori rilevati da ldr

const int buttonRPin=8; //bottone
int buttonState=0; //stato bottone
int stripState=0;

void setup() {
  
pinMode(ldrPin, INPUT);
Serial.begin(9600); //inizializzo la comunicazione seriale
pinMode(buttonRPin, INPUT_PULLUP); //la funzione pullup ragiona la contrario: 
//HIGH quando il circuito è aperto, LOW quando è chiuso
strip.begin();
strip.show();//inizializza la libreria neopixel 
}

     
void loop() {

val=analogRead(ldrPin); //salvo ldr dentro alla variabile val
Serial.println(val,DEC); //scrivo valore ldr in decimali
buttonState = digitalRead(buttonRPin); // legge il valore del bottone premuto come una variabile
  if(val<200 && buttonState==LOW) { 
  stripState=HIGH;//con bassa luminosità accendo il led
  strip.setPixelColor(1, strip.Color(255,255,255));
  strip.setPixelColor(2, strip.Color(255,255,255));
  strip.setPixelColor(3, strip.Color(255,255,255));
  strip.setPixelColor(4, strip.Color(255,255,255));
  strip.setPixelColor(5, strip.Color(255,255,255));
  strip.setPixelColor(6, strip.Color(255,255,255));
  strip.show(); //invia indicazione colore all hardware
  delay (5000);
  }
  else {
  stripState=LOW;
  strip.show(); //altrimenti spengo o lascio spento
  }
}

michelag:
Ora, inizialmente ho scritto lo sketch per un semplice led e funziona, ma per i Neopixel proprio non riesco.

Ci hai detto ciò che vuoi, NON ci hai detto il risultato che ottieni con il tuo codice e con i Neopixel ... e quindi cosa c'è che non va ... ::slight_smile:

Guglielmo

Ah ... comunque la sintassi più semplice della setPixelColor(), ricavata dal .h della libreria, è:

setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b);

... quindi la devi semplicemnete chiamare passando il numero del LED e tre valori byte (uint8_t) che indicano il valore R,G,B tipo :

setPixelColor(1, 255, 255, 255);

... per illuminare in bianco ed alla massima luminosità il LED numero 1.

Guglielmo

Grazie mille per la risposta.
Giustamente, ho dimenticato una parte abbastanza fondamentale...cosa ottengo?
Dal seriale vedo che la resistenza registra valori, ma i led non rispondono, non si accendono nè si spengono. Di conseguenza anche l'azione del bottone è assente.

Mmm ... non ho verificato la logica, ma se mi dici che prima, con il LED RGB funzionava, DEVE funzionare anche con i NeoPixel ...

Intanto piccola ottimizzazione del codice :

if(val<200 && buttonState==LOW) { 
 stripState=HIGH; //con bassa luminosità accendo il led
 for(int i = 1; i < 7; i++)
   strip.setPixelColor(i, 255,255,255);
 strip.show(); //invia indicazione colore all hardware
 delay (5000);
 }
 else {
 stripState=LOW;
 for(int i = 1; i < 7; i++)
   strip.setPixelColor(i, 0,0,0);
 strip.show(); //altrimenti spengo o lascio spento
 }

... e se non funziona, metti dentro l'IF un paio di Serial.print() per essere sicura che veramente ci entri.

naturalmente verifica anche il collegamento della striscia neoPixel ed il pin di comando utilizzato.

Guglielmo

Buonasera! Ho finalmente capito qual era il problema: lo stato dei tasti.

if(val<150 && newState==HIGH && old_State==LOW) { 
 Serial.println("LED ON");
 delay (20);
 newState = digitalRead (buttonRPin);
 stripState==LOW; //con bassa luminosità accendo il led
 for(int i = 0; i < 7; i++)
   strip.setPixelColor(i, 255,255,255);
 strip.show(); //invia indicazione colore all hardware
 delay (20);
 }
 else {
  Serial.println("LED OFF");
 stripState==HIGH;
 for(int i = 0; i < 7; i++)
   strip.setPixelColor(i, 0,0,0);
 strip.show(); //altrimenti spengo o lascio spento
 }
 
}

Il nuovo stato deve essere HIGH e il vecchio LOW.
Ora funziona perfettamente!

Grazie mille per l'aiuto!

Michela