Go Down

Topic: Zeitdauer eines HIGH-Signals wird durch das rechtliche Programm verfälscht (Read 266 times) previous topic - next topic

di_mar

Hallo zusammen,

ich erkläre erstmal was ich vorhabe.

Ich habe ein PWM Signal, das ich mit Arduino Uno einlese, und will dabei paar RGB LEDs (NeoPixel) ansteuern in Abhängigkeit von der Länge des PWM-Signals.

Die Auswertung des High-Pegels funktioniert ohne Probleme, aber sobald ich das Programm erweitere verfälscht es mir die Werte und macht nicht das was ich soll.

Hier der Code:
Code: [Select]
//
//  PWM-Signal einlesen
//
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

#define module1            2        // Pin2 zur Ansteuerung der LEDs (Neo Pixel WS2812)
#define pixelsmodule1      1      // 4 LEDs in einem Strang an Pin2

Adafruit_NeoPixel M1 = Adafruit_NeoPixel(pixelsmodule1, module1, NEO_GRB + NEO_KHZ800);

#define eingang 13                  //Pin13 zum Einlesen des PWM-Signals

unsigned long start;
unsigned long zeit;
unsigned long altezeit = 0;

boolean state = LOW;
boolean laststate = LOW;

void setup() {

 pinMode(eingang, INPUT);
 M1.begin();
 Serial.begin(115200);

}

void loop() {                                     //Zeitdauer eines High-Signals

 state = digitalRead(eingang);
 if (state == HIGH && laststate == LOW) {
   start = micros();
 }

 else if (state == LOW && laststate == HIGH) {
   zeit = micros() - start;
   Serial.print("Time: ");
   Serial.print(zeit);
   Serial.println(" mikrosekunden");
   delay(100);
 }

 laststate = state;

   if (10000 < zeit) {                                        //ab hier will die je nach "zeit"-wert die Farbe ändern
     for (int i = 0; i <= pixelsmodule1; i++) {     // hier ROT
       M1.setPixelColor(i, 0xFF0000);
     }
     M1.show();
   }
 
   else if (8000 < zeit < 10000) {                     //hier GRÜN
     for (int i = 0; i <= pixelsmodule1; i++) {
       M1.setPixelColor(i, 0x00FF00);
     }
     M1.show();
   }
 
   else if (6000 < zeit < 8000) {                       //hier BLAu
     for (int i = 0; i <= pixelsmodule1; i++) {
       M1.setPixelColor(i, 0x0000FF);
     }
     M1.show();
   }
 
   else {}

}

Die Werte passen so, aber sobald ich den Code mit der Farbauswahl erweitere, kriege ich nur ROT und GRÜN raus :(

Hoffe jemand kann mir helfen.

Danke im Voraus.

HotSystems

Setze deine Sketch wie üblich in Code-Tags, dann ist dieser von allen besser lesbar.
Verwende dazu [ code] vorweg und [/ code] dahinter, aber ohne die Leerzeichen.

Und das du Hilfe brauchst, musst du nicht noch zusätzlich schreiben.
Im Titel gehört eine aussagekräftige Beschreibung deines Problems.

Das ändere bitte noch.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Rentner

#2
Sep 17, 2020, 10:19 pm Last Edit: Sep 17, 2020, 10:26 pm by Rentner Reason: code optimiert
Hallo,

Deine Bedingungen

if (10000 < zeit) {  

else if (8000 < zeit < 10000) {                     //hier GRÜN

else if (6000 < zeit < 8000) {                       //hier BLAu


sind falsch, mach das mal  in der Art

Heinz


Code: [Select]


if ( zeit >6000 && zeit < 8000){ // zwischen 6000 und 8000


}

else if [ zeit >8000 && zeit < 10000){ // zwischen 8000 und 10000


}
else if (Zeit > 10000){  

}



Rentner

Hallo

noch eine Anmerkung

Deinen Post Hilfe zu benennen ist ja nicht besonders einfallsreich. Es macht Doch Sinn in den Tittel Dein Problem mit anzugeben.

"Problem mit if... else if " oder so was in der Art.

Heinz

DrDiettrich

Bei Problemen mit mehreren Wertebereichen empfiehlt sich eine systematische Programmierung der Form
Code: [Select]
if (x < min) ...
else if (x < 1000) ...
else if (x < max) ...
else fehler()

Solange man nicht auf Gleichheit prüft, mit der Gefahr der Verwechslung von = und ==, kann man auf den dämlichen C-Workaround mit vorangestellten Konstanten verzichten und die für Menschen besser lesbare Form mit Konstanten hinten benutzen.

agmue

Deinen Post Hilfe zu benennen ist ja nicht besonders einfallsreich.
@ di_mar: Das finde ich auch. Wenn Du in #0 den Betreff änderst, ändert sich auch die Anzeige in der Übersicht.

Ich habe ein PWM Signal, das ich mit Arduino Uno einlese, und will dabei paar RGB LEDs (NeoPixel) ansteuern in Abhängigkeit von der Länge des PWM-Signals.
Tut mir leid, aber das geht prinzipiell nicht, da die Ansteuerung der NeoPixel blockierend programmiert werden muß. Auch Interrupts sind abgeschaltet.

Alternativen:
  • Du  kannst LEDs vom Typ APA102 oder vergleichbar verwenden, die Takt und Daten getrennt haben. Deren Ausgabe könnte man per Interrupt unterbrechen.
  • Du verwendest einen zweiten Prozessor.


Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

di_mar

Hallo zusammen,

war keine Absicht mit der Benennung von Tonic. Ich bin hier relativ neu und wusste nicht, wie ich da am besten anfangen soll.

Vielen Dank, ich werde erstmal einen neuen Thread öffnen und alles anpassen.

HotSystems

Vielen Dank, ich werde erstmal einen neuen Thread öffnen und alles anpassen.
Wieso das denn ? ?

Ändere den Titel, das kannst du immer noch machen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

di_mar

Ich weiß nicht leider wie ich das ändern kann :(

Kurz zum dem Thema hier: mit der Funktion pulseIn(); habe ich das Problem nicht mehr und es läuft alles wie es soll. Zwar habe ich keine Ahnung warum, aber bin froh, dass es geklappt hat!

Gruß Dima

HotSystems

Ich weiß nicht leider wie ich das ändern kann :(
Sowas kann man nachlesen.....steht alles in How to use this Forum.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

di_mar

So ich habs geschafft, sowohl das Thema als auch das Problem mit dem Code.

Die Messung wurde immer verfälscht, sobald ich den Code mit den LEDs erweitert habe.

Nun nutze ich „pulseIn();" und programmiere die LEDs und der eingelesene Wert ist stabil :)

Gruß DiMar

Go Up