Hola a todos.
Estoy realmente atascado con un proyecto y la verdad es que no sé por donde tirar.
He hecho un programa que controla una tira de leds y los va encendiendo en función de los puertos de entrada. El programa en sí funciona correctamente pero presenta 2 problemas. El primero es que tarda unos 6 segundos en estar operativo desde que recibe alimentación y el segundo es el consumo de energía, va instalado en el coche y tiene que ir a la batería por lo que necesito reducir el consumo del Attiny85 en reposo al máximo y no sé como hacerlo.
Este es el código:
#include <Adafruit_NeoPixel.h>
// Pines totales tira
#define NUMPIXELS 15
// Puerto de datos tira
#define PIN 4
// TIEMPO ALARMA
// ENCENDIDO == 200ms
// APAGADO == 200ms
//
// TIEMPOS SIN CONTACTO
// ENCENDIDO == 300ms
// APAGADO == 500ms
//
// TIEMPOS CON CONTACTO
// ENCENDIDO == 400ms
// APAGADO == 400ms
//
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ400); //Define el objeto pixels que es la tira de leds
const int INTERMITENTE_SEC=1; // Entrada señal intermitentes
const int INTERMITENTE_LEG=3; // Entrada con + constante intermitente normal
const int MARCHA_ATRAS=2; // Entrada señal + marcha atrás
const int POWER_LED=0; // Salida +5 Relé alimentación LED´s
const int SALIDA=4; // Salida datos LED´s
int ESTADO_INTERMITENTE;
int ESTADO_LEGAL;
int ESTADO_MARCHA;
int i = 15;
int flag = 1;
int Tiempo_Secuencia = 25; // TIEMPO AJUSTABLE DE ENCENDIDO DE LED A LED
int Tiempo_Rele = 5; // TIEMPO ACTIVACIÓN ANTES DE ENVIAR SEÑAL DE DATOS A LA TIRA DE LEDS
unsigned long currentMillis = millis();
unsigned long previousMillis = millis();
unsigned long interval = 450;
//------ CAMBIAN SEGÚN LA TIRA DE LEDS-------------------
// APAGADO (000.000.000)
// PRIMEROS (255.000.000) 3 DÍGITOS SON AMARILLO
// SEGUNDOS (000.255.000) 3 DÍGITOS SON BLANCO
void Turn_OFF() // TODO APAGADO
{
digitalWrite(POWER_LED, LOW);
for(int i=0;i<NUMPIXELS;i++)
{
strip.setPixelColor(i, strip.Color(000,000,000)); // LED´s OFF
}
strip.show(); // Update LED´s.
}
void INTERMITENTE_SECUENCIAL() // INTERMITENTE DINÁMICO
{
digitalWrite(POWER_LED, HIGH);
delay(Tiempo_Rele);
for(int i=0;i<NUMPIXELS;i++)
{
if (NUMPIXELS == 15)
{
strip.setPixelColor(14-i, strip.Color(000,000,255)); // LED´s Amarillos.
}
delay(Tiempo_Secuencia);
strip.show(); // Update LED´s.
}
}
void INTERMITENTE_LEGAL() // INTERMITENTE SIMULTÁNEO ////// !!!!!!!!!!!!!! Tienen que encender solo los 10 últimos !!!!!!!!!!!!!!!
{
digitalWrite(POWER_LED, HIGH);
delay(Tiempo_Rele);
for(int i=0;i<NUMPIXELS;i++)
{
if (NUMPIXELS == 15)
{
strip.setPixelColor(9-i, strip.Color(000,000,255)); // LED´s Amarillos.
}
}
strip.show(); // Update LED´s.
}
void Rear_Gear_ON() // MARCHA ATRÁS ACTIVA
{
digitalWrite(POWER_LED, HIGH);
delay(Tiempo_Rele);
for(int i=0;i<NUMPIXELS;i++)
{
if (NUMPIXELS == 15)
{
strip.setPixelColor(i, strip.Color(000,255,000)); // LED´s White
}
}
strip.show(); // Update LED´s.
}
void setup()
{
strip.begin();
pinMode(INTERMITENTE_SEC,INPUT);
pinMode(INTERMITENTE_LEG,INPUT);
pinMode(MARCHA_ATRAS,INPUT);
pinMode(SALIDA,OUTPUT);
pinMode(POWER_LED,OUTPUT);
}
void loop()
{
ESTADO_INTERMITENTE = digitalRead(INTERMITENTE_SEC);
ESTADO_LEGAL = digitalRead(INTERMITENTE_LEG);
ESTADO_MARCHA = digitalRead(MARCHA_ATRAS);
if (ESTADO_INTERMITENTE == LOW)
{
flag = 1;
}
if (ESTADO_INTERMITENTE == LOW && ESTADO_MARCHA == LOW && ESTADO_LEGAL == LOW)
{
// LED´s OFF
Turn_OFF();
}
if (ESTADO_INTERMITENTE == LOW && ESTADO_MARCHA == LOW && ESTADO_LEGAL == HIGH)
{
// LED´s OFF
Turn_OFF();
}
else if (ESTADO_INTERMITENTE == HIGH && ESTADO_MARCHA == LOW && ESTADO_LEGAL == LOW)
{
// LED´s en amarillo secuencial
if (flag == 1){
INTERMITENTE_SECUENCIAL();
delay(Tiempo_Secuencia);
flag = 0;
}else{
Turn_OFF();}
}
else if (ESTADO_INTERMITENTE == HIGH && ESTADO_MARCHA == LOW && ESTADO_LEGAL == HIGH)
{
// LED´s en amarillo simultáneo
INTERMITENTE_LEGAL();
}
else if (ESTADO_INTERMITENTE == LOW && ESTADO_MARCHA == HIGH && ESTADO_LEGAL == LOW)
{
currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// LED´s en blanco
Rear_Gear_ON();
}else{
// LED´s OFF
Turn_OFF();
}
}
else if (ESTADO_INTERMITENTE == LOW && ESTADO_MARCHA == HIGH && ESTADO_LEGAL == HIGH)
{
// LED´s OFF
Turn_OFF();
}
else if (ESTADO_INTERMITENTE == HIGH && ESTADO_MARCHA == HIGH && ESTADO_LEGAL == HIGH)
{
// LED´s en amarillo simultáneo
INTERMITENTE_LEGAL();
previousMillis = millis();
}
else if (ESTADO_INTERMITENTE == HIGH && ESTADO_MARCHA == HIGH && ESTADO_LEGAL == LOW)
{
// LED´s en amarillo secuencial
if (flag == 1){
INTERMITENTE_SECUENCIAL();
delay(Tiempo_Secuencia);
flag = 0;
}else{
Turn_OFF();}
previousMillis = millis();
}
}
Agradezco cualquier ayuda, gracias !!!