Hallo,
Ich bin neu hier und hätte ein Problem.
Ich möchte mit dem UNO einen Led strip steuern. Dazu nutz ich Neopixel.
Das funktioniert auch gut.
bedienen möchte ich das über ein Nextion display.
Zuerst hatte ich mit dem Nextion nur int geschickt (print 1 usw).
Das hat auch funktoniert. Weil mein funktionsumfang jetzt aber immer grösser wird,
wollte ich zur besser möglichen nutzung einen String schicken der dann ich ein Array gelegt wird.
Solange ich nur vom Nextion zum Uno sende, kommt immer alles richtig an.
Aber wenn ich die empfangen Daten benutze um den Strip zu schalten, kommen die Daten sporalisch falsch an.
Zur kontrolle habe ich hinter serial.read direkt ein serial.print gesetzt.
Normalerweise schicke ich z.b <26> oder <01> usw.
< und > sind start und endzeichen.
oft kommt aber nur <0> an.
aber wie gesagt nur, wenn der strip an ist. Wenn ich switch case ausklammere, kommt immer alles richtig an.
ich hatte versucht zwischen den einzelnen werten noch trenner zu setzen die erkannt werden sollen.
z.b. <2,6> oder <2,4,3>. diese dann in ein int array zu legen das ich zum steuern nehmen kann.
Dies hat auchmal funktioniert. jedoch habe ich dann gemerkt das der Slider Wert so nicht mehr gelesen werden kann. momentan benutze ich den slider so:
print "<"
print slider.val
print ">"
was ich auch noch nicht ganz verstehe, wenn ich serial.println(data[0]) printe, bekomme ich eine 0, wenn ich serial.print(seite) mache, bekomme ich ascci.
wie kann ich das einlesen verbessern?
lg
Hichi
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define NUM_LEDS 150
#define PIN 3
#define BRIGHTNESS 20
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
const byte numChars = 32;
char data[numChars];
boolean newData = false;
int seite;
int objekt;
int i;
//seriell einlesen
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
data[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
data[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
//seriell ausgeben zur kontrolle
void showNewData() {
if (newData == true) {
seite = (data[0]);
objekt = data[1];
// Serial.print("This just in ... ");
Serial.println(seite);
Serial.println(objekt);
// Serial.println(data[2]);
// Serial.println(data[3]);
// Serial.println(data[4]);
// Serial.println(data[5]);
//Serial.println(data[6]);
//Serial.println(data[7]);
newData = false;
}
}
//led strip dauerlicht
void einfarbig(uint32_t c) {
if (i<strip.numPixels()){
i++;
strip.setPixelColor(i, c);
}
strip.show();
}
void setup() {
strip.begin();
strip.show();
Serial.begin(115200);
Serial.println("<Arduino is ready>");
}
void loop() {
//seriell einlesen
recvWithStartEndMarkers();
showNewData();
//Led strip dauerlicht
if (seite == 48) {
switch (objekt) {
case 48:
einfarbig(strip.Color(255, 0, 0)); //rot
break;
case 49:
einfarbig(strip.Color(0, 255, 0)); //gruen
break;
case 50:
einfarbig(strip.Color(255, 255, 5)); //gelb
break;
case 51:
einfarbig(strip.Color(0, 0, 255)); //blau
break;
case 52:
einfarbig(strip.Color(255, 128, 0)); //orange
break;
case 53:
einfarbig(strip.Color(255, 0, 255)); //lila
break;
case 54:
einfarbig(strip.Color(255, 0, 128)); //pink
break;
case 55:
einfarbig(strip.Color(255, 255, 255)); //blau
break;
}
}
}