Hallo,
okay, mit Registern möchte ich mich noch nicht so tief befassen wenn es nicht unbedingt sein muß. Ich speicher die Werte jetzt zwischen und gebe sie am Ende mit allen anderen aus.
Kann ich hier auch eine Frage zu Processing stellen? Ich habe nämlich ein Problem mit der Darstellung der analogen Scrollbalken nebeneinander. Untereinander wird alles richtig ins Fenster gemalt. Setze ich weitere daneben, wird etwas Müll angezeigt. Als wenn die Zeichenfunktion draw ohne Rücksicht die Zeile komplett überschreibt.
Der Processing Sketch liegt im Dateianhang. Wenn man die auskommentierten 4 IF Abfragen bei "Ist Datentyp PWM Analog" wieder hinzunimmt, werden die 3 Balken dargestellt, aber leider etwas fehlerhaft im Detail. Platziert man sie weiter unten, soweit man Platz hat, funktioniert alles.
Wegen Copyright noch eine Anmerkung. Die Basis vom Code stammt aus Erik Bartmann seinen Arduino Buch. Nicht das ich mit Erik Ärger bekommen.
zum Arduino Code testen einfach ein Poti an A0 anschließen und 3 LEDs an Pin 8 bis 10, dann Poti langsam drehen ...
// Arduino Mega 2560
int LED_R = 8; // an Pin 8
int LED_G = 9; // an Pin 9
int LED_B = 10; // an Pin 10
int analogPin = 0; // Poti am analog pin A0
int val = 0; // Potiwert speichern in val
int val_mapped = 0; // Potiwert für PWM umgewandelt
int val_PWMwert_R = 0; // Zwischenspeicher für RS232 Ausgabe
int val_PWMwert_G = 0; // Zwischenspeicher für RS232 Ausgabe
int val_PWMwert_B = 0; // Zwischenspeicher für RS232 Ausgabe
void setup(){
Serial.begin(9600); // Übertragungsrate
// LED Pins auf Ausgang setzen
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
// kurzer LED Funktionstest
digitalWrite(LED_R, HIGH); // Rot EIN
delay(300);
digitalWrite(LED_G, HIGH); // Grün ein
delay(300);
digitalWrite(LED_B, HIGH); // Blau ein
delay(300);
digitalWrite(LED_R, LOW); // ROT aus
digitalWrite(LED_G, LOW); // Grün aus
digitalWrite(LED_B, LOW); // Blau aus
// Ende des LED Funktionstest
// alle digitalen Eingänge mit PullUp aktivieren
for(int i = 46; i <= 53; i++) { // Pin 46 bis 53
pinMode(i, INPUT); // setzt pin als Eingang
digitalWrite(i, HIGH); // aktiviert den PullUp Widerstand
}
}
void loop(){
val = analogRead(analogPin); // reads the value of the potentiometer (value between 0 and 1023)
// *** LED ROT **************************************
if (val <= 170) {
val_mapped = map(val, 0, 170, 0, 255);
analogWrite(LED_R, val_mapped);
val_PWMwert_R = val_mapped; // Zwischenspeicher für RS232 Ausgabe
}
if (val >= 171 && val <= 340) {
digitalWrite(LED_G, 0); // vorhergehende LED sicher ausschalten
val_PWMwert_G = 0; // Zwischenspeicher löschen sonst Anzeige verfälscht
val_mapped = map(val, 171, 340, 255, 0);
analogWrite(LED_R, val_mapped);
val_PWMwert_R = val_mapped; // Zwischenspeicher für RS232 Ausgabe
}
// *** LED GRÜN **************************************
if (val >= 341 && val <= 513) {
digitalWrite(LED_R, 0); // vorhergehende LED sicher ausschalten
val_PWMwert_R = 0; // Zwischenspeicher löschen sonst Anzeige verfälscht
val_mapped = map(val, 341, 513, 0, 255);
analogWrite(LED_G, val_mapped);
val_PWMwert_G = val_mapped; // Zwischenspeicher für RS232 Ausgabe
}
if (val >= 514 && val <= 683) {
digitalWrite(LED_B, 0); // vorhergehende LED sicher ausschalten
val_PWMwert_B = 0; // Zwischenspeicher löschen sonst Anzeige verfälscht
val_mapped = map(val, 514, 683, 255, 0);
analogWrite(LED_G, val_mapped);
val_PWMwert_G = val_mapped; // Zwischenspeicher für RS232 Ausgabe
}
// *** LED BLAU **************************************
if (val >= 684 && val <= 853) {
digitalWrite(LED_G, 0); // vorhergehende LED sicher ausschalten
val_PWMwert_G = 0; // Zwischenspeicher löschen sonst Anzeige verfälscht
val_mapped = map(val, 684, 853, 0, 255);
analogWrite(LED_B, val_mapped);
val_PWMwert_B = val_mapped; // Zwischenspeicher für RS232 Ausgabe
}
if (val >= 854) {
val_mapped = map(val, 854, 1023, 255, 0);
analogWrite(LED_B, val_mapped);
val_PWMwert_B = val_mapped; // Zwischenspeicher für RS232 Ausgabe
}
// für Processing
// sende analoge Werte
for(int i = 0; i <= 15; i++) // Pin 0 bis 15
Serial.println(normalize("A", i, analogRead(i)));
Serial.println(normalize("P", LED_R, val_PWMwert_R));
Serial.println(normalize("P", LED_G, val_PWMwert_G));
Serial.println(normalize("P", LED_B, val_PWMwert_B));
// Sende digitale Werte
for(int i = 46; i <= 53; i++) // Pin 46 bis 53
Serial.println(normalize("D", i, digitalRead(i)));
} // Loop Ende
// Klassen
String normalize(String t, int pin, int value){
String pinString = String(pin);
String valueString = String(value);
if(pin < 10)
pinString = "0" + String(pin); // Wenn einstellig, dann führende Null anfügen
int count = 4 - valueString.length();
for(int i = 0; i < count; i++)
valueString = String("0") + valueString; // Führende Nullen
// anfügen
String r = String("S") + String(t) + String(pinString) +
String(valueString) + String("E");
return r; // Normalisierte Zeichenkette wird zurückgeliefert
}
LED_Poti_AnalogDigitalTalker.zip (2.53 KB)