codificación usando Arduino, dos 74HC595 y dos LED RGB, problemas con el desplazamiento de la base de datos

1

el punto central de esto era poder enviar 8 bits de código de color a 2 lbg de leds a través de 2 registros de 74hc595. Si puedo obtener el color predeterminado para cada led que se enviará, la siguiente parte del código es tener una interfaz de usuario para permitir que alguien seleccione qué led y qué color quiere. Así que ahora intentamos cambiar los colores predeterminados de estos 2 leds. Cuando compilé no conseguí cambiar los leds que no cambiaban. como dije que soy un noob en estas cosas.

#include <arduino.h>
const int ledred = (char)0x80;            
const int ledgreen = 0x20;    
const int ledcyan = 0x28;    
const int ledyellow = (char)0x0A0;    
const int ledwhite = (char)0x0A8;   
const int ledblack = 0x00;    
const int ledvoliet = 0x44;    
const int ledblue = 0x08;

#define step1 1
#define step2 2
#define step3 3
#define step4 4
#define step5 5
#define step6 6
#define step7 7
#define step8 8

#define led1 1
#define led2 2
#define led3 3
#define led4 4
#define led5 5
#define led6 6
#define led7 7
#define led8 8

char display_step;    
char i;    
char c;    
char str[80],sstep,lamp,color;    
int done;    
char colors [8][7]={
  "Red   " ,"Green"   ,"Cyan  "   ,"Yellow"  ,"White "  ,"Black "  ,"Voliet"  ,"Blue  "};

char database[56]={
  8,ledred,ledgreen,ledcyan,ledyellow,ledblack,ledwhite,
  7,ledvoliet,ledblue,ledwhite,ledyellow,ledcyan,ledred,
  3,ledred,ledred,ledred,ledblue,ledblue,ledblue,
  5,ledred,ledwhite,ledblue,ledred,ledwhite,ledblue,
  9,ledgreen,ledblue,ledvoliet,ledyellow,ledcyan,ledblack,
  4,ledblack,ledblue,ledblack,ledyellow,ledblack,ledcyan,
  6,ledwhite,ledblue,ledgreen,ledvoliet,ledcyan,ledyellow,
  10,ledgreen,ledyellow,ledblue,ledred,ledblack,ledblue};

char numberlamps=2;    
char numbersteps=8;    
const int data = 9;     
const int clock = 10;    
const int latch = 8;

int main()
{    
  pinMode(data, OUTPUT);    
  pinMode(clock, OUTPUT);      
  pinMode(latch, OUTPUT);     
}

void loop(){                  


    int index;    
    int i;    
    int updateLEDs;    
    int lampvalue;


      display_step = 1 + display_step%numbersteps;    
      index = (display_step - 1)*(numberlamps + 1);    
      time = database[index];    
      for( i = index +1; i < numberlamps  ; i++);

      lampvalue = database[index];    
      digitalWrite(latch, LOW);         
      shiftOut(data, clock, MSBFIRST, lampvalue);    
      digitalWrite(latch, HIGH);  

  }
    
pregunta aces1026

3 respuestas

2

Sospecho que este no es el código completo.

  1. No puede usar delay como nombre de variable, es (esencialmente) una palabra reservada en Arduino (en realidad es una función predefinida), y de todos modos no usa esa variable para nada.
  2. Necesita corchetes en su include (es decir, #include <arduino.h> )
  3. Tienes un bloque de código (el conjunto más interno de los espacios entre llaves { ... } ) sin ninguna razón aparente

ACTUALIZAR :

  1. Probablemente no debería tener un punto y coma después de for( i = index +1; i < numberlamps ; i++) , y probablemente debería tener llaves alrededor de las siguientes líneas de código.
  2. La línea display_step = 1 + display_step%numbersteps; probablemente debería leer display_step = (1 + display_step)%numbersteps;
  3. Lees información en la variable time , pero luego no haces nada con esa información.
  4. Una forma muy efectiva de diagnosticar problemas con el código de Arduino de esta manera es usar el Monitor Serial para generar periódicamente valores de variables relevantes a medida que se ejecuta su programa, utilizando las declaraciones Serial.println(var_name) .

El problema realmente es que su código no tiene sentido y no tiene comentarios que expresen lo que piensa hace ... ¿Qué tal empezar dibujando y compartiendo un diagrama de flujo?

    
respondido por el vicatcu
2

¿Ha considerado pasar por un tutorial como el tutorial de LadyAda's Arduino ?

Responde a muchas preguntas y problemas comunes, por lo que podemos dedicar tiempo a solucionar problemas nuevos e interesantes :-).

El mayor problema que veo en este código es

int main() // Doesn't work with Arduino -- Arduino has its own internal main().
{    
  pinMode(data, OUTPUT);    
  pinMode(clock, OUTPUT);      
  pinMode(latch, OUTPUT);     
}

Ya que estás usando un Arduino, es casi seguro que quieras reemplazarlo con algo más como:

void setup() {
  pinMode(data, OUTPUT);    
  pinMode(clock, OUTPUT);      
  pinMode(latch, OUTPUT);     
}
    
respondido por el davidcary
0

¿Cómo / dónde se llama loop ()?

Un diagrama de circuito ayudaría también. Hay dos posibles problemas adicionales: el pin OE (habilitación de salida) del registro de desplazamiento de 74hc595 (pin 13 en la versión DIP) debe estar BAJO para que el registro de cambio emita algo, mientras que el pin MR (reset maestro) (pin 10) en el DIP) debe ser alto. Probablemente desee vincular el OE al suelo y MR al VCC mientras realiza la prueba.

vicatcu tiene razón en que cada 74HC595 puede en teoría manejar dos leds, ya que cada uno tiene 8 salidas (9 si cuenta la línea Q7S), sin embargo, cada chip solo puede manejar 70mA máximo, lo que significa que cada una de sus líneas LED se limitará a 11.5 mA de corriente, es decir, no será tan brillante como podría ser de otra manera. No obstante, ¿cómo se conectan los dos 74HC595? Si está ejecutando las mismas líneas de datos, de reloj y de retención en ambas (es decir, configuración paralela), no puede abordarlas por separado.

    
respondido por el angelatlarge

Lea otras preguntas en las etiquetas