I need your help, I'm trying to make a strip of leds WS2812b turns red (all) when a digital input is at "0" and changes to white (all) when it is at "1"
This is my code:
// LED + Pulsador
#include <Adafruit_NeoPixel.h>
// Pines totales tira
#define NUMPIXELS 72
// Puerto de datos tira
#define PIN 5
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); //define el objeto pixels que es la tira de leds
const int led=5;
const int pulsador=4;
int val;
void setup()
{
pixels.begin();
pinMode(pulsador,INPUT);
pinMode(led,OUTPUT);
}
void loop()
{
val=digitalRead(pulsador);
if (val==HIGH)
{
for(int i=71;i<NUMPIXELS;i--)
{
pixels.setPixelColor(i, pixels.Color(255,255,255)); // BLANCO
pixels.show(); // Actualiza los leds.
delay(2); // espera para el encendido de cada led.
}
}
else
{
for(int i=71;i<NUMPIXELS;i--)
{
pixels.setPixelColor(i, pixels.Color(255,000,000)); // ROJO
pixels.show(); // Actualiza los leds.
delay(1);
}
}
}
It works correctly every time arduino starts but then the loop does not continue, it does not change state.
The first version of the project works correctly, I have decided to modify some small details, depending on the input will change color to another as follows:
LED off
A = + red color (simultaneous ignition)
A = + and B = + white color (progressive ignition)
A = + (after white) change from white to progressive red
LED off (simultaneous shutdown)
The case is that I want that if B never happens to + the LEDs turn on and off simultaneously but the B ignition is progressive (this is OK) and the step from B to A is also progressive (here I am stuck).
I have thought to introduce a variable "BANDERA" that if it is "0" A always turn on and off simultaneously but if "BANDERA" at some point becomes "+" the shutdown is progressive.
#include <Adafruit_NeoPixel.h>
// Pines totales tira
#define NUMPIXELS 90
// Puerto de datos tira
#define PIN 4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); //Define el objeto pixels que es la tira de leds
const int LUZ_ENCENDIDA=2;
const int MARCHA_ATRAS=3;
const int SALIDA=4;
int ESTADO_LUZ;
int ESTADO_MARCHA;
int BANDERA = 0;
void setup()
{
strip.begin();
pinMode(LUZ_ENCENDIDA,INPUT);
pinMode(MARCHA_ATRAS,INPUT);
pinMode(SALIDA,OUTPUT);
}
void loop()
{
ESTADO_LUZ=digitalRead(LUZ_ENCENDIDA);
ESTADO_MARCHA=digitalRead(MARCHA_ATRAS);
if (ESTADO_LUZ==LOW & ESTADO_MARCHA==LOW) // Todo apagado
{
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(i, strip.Color(000,000,000)); // LED´s Apagados
}
strip.show(); // Simultaneo
}
if (ESTADO_LUZ==HIGH & ESTADO_MARCHA==LOW) // Luz ambiente encendida
{ if (BANDERA==1)
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(i, strip.Color(200,000,000)); // LED´s Rojo
strip.show(); // Progresivo.
}
else
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(i, strip.Color(200,000,000)); // LED´s Rojo
}
strip.show(); // Simultaneo
}
if (ESTADO_LUZ==HIGH & ESTADO_MARCHA==HIGH) // Marcha atrás puesta
{
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(89-i, strip.Color(150,150,150)); // LED´s Blanco 255 seria brillo máximo
strip.show(); // Progresivo.
}
BANDERA==1;
}
}
LED off
A = + red color (simultaneous ignition)
A = + and B = + white color (progressive ignition)
A = + (after white) change from white to progressive red
LED off (simultaneous shutdown)
A = +5v in pin 2 Sensor to know the car is on
B= +5v in pin 3 sensor to know the reverse gear is on
The sequence is as follows.
I turn on the car -> the LEDs turn red simultaneously
I turn off the car -> LED's turn off simultaneously
With the car on (leds are red), the leds change to white sequentiall when reverse gear is on, when the reverse gear is removed, the LEDs change back to red sequentially.
Still not sure I understand. But your code is written using just two functions setup and loop.
It will be a lot simpler to understand if you make each action you want the LEDs to do into its own function. Then you can concentrate on the logic to read the sensors and call the functions that do the action.
I make this changes but not work I think that is somenting wrong in the logic but a have no idea to how make it.
The behavior should be as follows:
When the car is switched on (PIN 2 has + 5v) the LEDs turn on at the same time in red. (This works)
When the car is switched off (PIN 2 has 0) the LEDs turn off at the same time in red. (This works)
If the car is on (PIN 2 has + 5v) and rear gear is on (PIN 3 has + 5v) the LEDs change to white sequentially (this works)
When rear gear is off again LEDs should return to red sequentially (This fails)
#include <Adafruit_NeoPixel.h>
// Pines totales tira
#define NUMPIXELS 90
// Puerto de datos tira
#define PIN 4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); //Define el objeto pixels que es la tira de leds
const int LUZ_ENCENDIDA=2;
const int MARCHA_ATRAS=3;
const int SALIDA=4;
int ESTADO_LUZ;
int ESTADO_MARCHA;
int BANDERA;
void Turn_ON() // Car turn ON and all LED´s turn ON same time
{
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(i, strip.Color(200,000,000)); // LED´s Red.
}
strip.show(); // Update LED´s.
}
void Turn_OFF() // Car turn OFF and all LED´s turn OFF same time
{
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(i, strip.Color(000,000,000)); // LED´s OFF
}
strip.show(); // Update LED´s.
}
void Rear_Gear_ON() // Rear gear ON and all LED´s turn ON one by one
{
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(89-i, strip.Color(150,150,150)); // LED´s White
strip.show(); // Update LED´s.
}
}
void Rear_Gear_OFF() // Rear gear OFF and all LED´s turn OFF one by one (change to red one by one)
{
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(i, strip.Color(200,000,000)); // LED´s Red.
strip.show(); // Update LED´s.
}
}
void setup()
{
strip.begin();
pinMode(LUZ_ENCENDIDA,INPUT);
pinMode(MARCHA_ATRAS,INPUT);
pinMode(SALIDA,OUTPUT);
}
void loop()
{
ESTADO_LUZ=digitalRead(LUZ_ENCENDIDA);
ESTADO_MARCHA=digitalRead(MARCHA_ATRAS);
BANDERA = 0;
if (ESTADO_LUZ==LOW & ESTADO_MARCHA==LOW) // LED´s OFF
{
Turn_OFF();
}
if (ESTADO_LUZ==HIGH & ESTADO_MARCHA==LOW) // LED´s in RED
{
Turn_ON();
}
if (ESTADO_LUZ==HIGH & ESTADO_MARCHA==HIGH) // LED´in white
{
BANDERA==BANDERA+1;
if (BANDERA > 0)
{
Rear_Gear_OFF();
}
else
{
Rear_Gear_ON();
}
}
}
I continue with this project and I saw that I have some problem.
I am trying that a strip of LEDs behave in one way or another depending on the entry by 2 pins (PIN 2 and PIN 3) the problem I have is that one of them (PIN 3) occasionally sends voltage to verify the circuit and creates false positives.
I have thought that only the output is activated when PIN 3 is for example 1 second active, but I can not get it to work correctly.
the problem I have is that one of them (PIN 3) occasionally sends voltage to verify the circuit and creates false positives.
If that is truly the problem then you have a hardware problem. So to be able to diagnose this we need a schematic of your circuit along with a photograph of you hardware that is in sufficient clarity that we can follow the wiring.
I have thought that only the output is activated when PIN 3 is for example 1 second active,
That is just a sticking plaster and will not actually cure the problem.
A = +5v in pin 2 Sensor to know the car is on
B= +5v in pin 3 sensor to know the reverse gear is on
So is this car a real grownups car or is it a model?
If this is a real car then what have you done to mitigate the hostile electric environment you have?
What is the value of your pull down resistor and do you have a 0.1uF ceramic capacitor across this resistor.
Wait 1 second is a valid solution since there is no hardware problem
Well I am telling you there is a problem with your hardware. If you don't want to here this then it is up to you. But I will waste no more time advising you.
Goodbye and good luck.