Codierung mit Arduino, zwei 74HC595 und zwei RGB-LED, Probleme beim Auslagern der Datenbank

Der springende Punkt dabei war, 8 Bit Farbcode über 2 74hc595-Register an 2 RGB-LEDs senden zu können. Wenn ich die Standardfarbe für jede zu sendende LED erhalten kann, besteht der nächste Teil des Codes darin, eine Benutzeroberfläche zu haben, mit der jemand auswählen kann, welche LED und welche Farbe er möchte. Versuchen Sie jetzt, die Standardfarben auf diese 2 LEDs zu verschieben. Als es kompiliert wurde, bekam ich keine Schalt-LEDs, die sich nicht änderten. wie gesagt ich bin ein noob was das Zeug angeht.

#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);  

  }
Dies erfordert eine Bearbeitung / Bereinigung, markieren Sie die Codeblöcke und klicken Sie auf die Schaltfläche '{}'
Was ist die Frage ... der Code wird nicht einmal ohne Fehler kompiliert ... was versuchen Sie zu tun?
Warum braucht man zwei Schieberegister, um zwei RGB-LEDs anzusteuern? Ein Schieberegister hat acht Ausgänge. Jede RGB-LED benötigt drei Eingänge ...

Antworten (3)

Ich vermute, dass dies nicht der gesamte Code ist.

  1. Sie können es nicht delayals Variablennamen verwenden, es ist (im Wesentlichen) ein reserviertes Wort in Arduino (es ist eigentlich eine vordefinierte Funktion), und Sie verwenden diese Variable sowieso für nichts.
  2. Sie benötigen Klammern in Ihrem Include (dh #include <arduino.h>)
  3. Sie haben einen Codeblock (den innersten Satz von Klammern { ... }) ohne ersichtlichen Grund

AKTUALISIEREN:

  1. Sie sollten wahrscheinlich kein Semikolon nach haben for( i = index +1; i < numberlamps ; i++), und Sie sollten wahrscheinlich geschweifte Klammern um die nachfolgenden Codezeilen haben.
  2. Die Zeile display_step = 1 + display_step%numbersteps;sollte wahrscheinlich lautendisplay_step = (1 + display_step)%numbersteps;
  3. Sie lesen Informationen in die timeVariable ein, machen dann aber nichts mit diesen Informationen.
  4. Eine sehr effektive Möglichkeit, Probleme mit Arduino-Code wie diesem zu diagnostizieren, besteht darin, den seriellen Monitor zu verwenden, um regelmäßig relevante Variablenwerte auszugeben, während Ihr Programm ausgeführt wird, indem Serial.println(var_name)Anweisungen verwendet werden.

Das Problem ist wirklich, dass Ihr Code keinen Sinn ergibt und keine Kommentare enthält, die ausdrücken, was er Ihrer Meinung nach tut ... wie wäre es, wenn Sie damit beginnen, ein Flussdiagramm zu zeichnen und zu teilen?

Der springende Punkt dabei war, 8 Bit Farbcode über 2 74hc595-Register an 2 RGB-LEDs senden zu können. Wenn ich die Standardfarbe für jede zu sendende LED erhalten kann, besteht der nächste Teil des Codes darin, eine Benutzeroberfläche zu haben, mit der jemand auswählen kann, welche LED und welche Farbe er möchte. Versuchen Sie jetzt, die Standardfarben auf diese 2 LEDs zu verschieben. Als es kompiliert wurde, bekam ich keine Schalt-LEDs, die sich nicht änderten. wie gesagt ich bin ein noob was das Zeug angeht.
Dieser Teil des Programms besteht darin, nur die Schritte und den Lambcode zu betrachten, um die Bits zu aktualisieren, die auf LEDs verschoben werden

Haben Sie darüber nachgedacht, vielleicht ein Tutorial wie das Arduino-Tutorial von LadyAda durchzugehen ?

Es beantwortet viele häufige Fragen und Probleme, sodass wir Zeit damit verbringen können, neue und interessante Probleme zu beheben :-).

Das größte Problem, das ich in diesem Code sehe, ist

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

Da Sie ein Arduino verwenden, möchten Sie das mit ziemlicher Sicherheit durch etwas Ähnliches ersetzen:

void setup() {
  pinMode(data, OUTPUT);    
  pinMode(clock, OUTPUT);      
  pinMode(latch, OUTPUT);     
}

Wie / woher wird loop() aufgerufen?

Ein Schaltplan würde auch helfen. Es gibt zwei weitere mögliche Probleme: Der 74hc595-Schieberegister-OE-Pin (Ausgangsaktivierung) (Pin 13 in der DIP-Version) muss LOW sein, damit das Schieberegister etwas ausgeben kann, während der MR-Pin (Master-Reset) (Pin 10 im DIP) muss hoch sein. Sie möchten wahrscheinlich OE mit Masse und MR mit VCC verbinden, während Sie testen.

Vicatcu hat Recht, dass jeder 74HC595 theoretisch zwei LEDs ansteuern kann, da jeder 8 Ausgänge hat (9, wenn Sie die Q7S-Leitung zählen), jeder Chip kann jedoch nur maximal 70 mA ansteuern, was bedeutet, dass jede Ihrer LED-Leitungen begrenzt ist bis 11,5 mA Strom, dh nicht so hell wie sonst sein könnte. Wie sind die beiden 74HC595 trotzdem verbunden? Wenn Sie die gleichen Daten-, Takt- und Latch-Leitungen zu beiden führen (dh parallele Konfiguration), können Sie sie nicht separat adressieren.

loop() ist ein Arduino-Ding, der Bootstrap ruft eine Funktion namens setup() auf und ruft dann kontinuierlich loop() auf.
Oh, richtig. Es ist schon eine Weile her, dass ich Arduino gemacht habe. Ich habe vergessen, dass main() vor dem Benutzer verborgen ist.