Hallo,
möchte mir ein kleines Interface für den PC sowie für das Smartphone entwickeln. Der Arduino wird über den HC-05 angesteuert.
Ich möchte nicht ständig alle Daten zum Arduino schicken, habe mich somit für eine einfache Kodierung basierend auf Hexzahlen entschieden.
Jeder Regler schickt nun seinen Wert (0-255) an den Arduino wie folgt. 0x(ID(0-F)(Wert(0-FF).
Für einen Wert von 127 für den ersten Regler würde das wie folgt dann im Arduino gehandhabt:
0x07F
Für einen Wert von 255 für den zweiten Regler würde das wie folgt aussehen:
0x1FF
....
Habe nun das Problem, dass die Eingabe über Putty nicht der entsprechenden Auswertung entspricht.
1025
Befehl: 0x401
var: 1
1205
Befehl: 0x00C
hue: 12
1205
Befehl: 0x4B5
var: 181
1205
Befehl: 0x4B5
var: 181
#include <FastLED.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#define NUM_LEDS 36
#define RGB_ORDER GRB
#define DATA_PIN 6
CRGB leds[NUM_LEDS];
static FILE uartout = { 0 };
int uart_putchar(char, FILE);
void setupLeds(void);
void rainbow(int, int, int, bool, int);
int main(void) {
init();
setupLeds();
/* Serielle Verbindung ueber Bluetooth */
Serial.begin(115200);
fdev_setup_stream(&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
stdout = &uartout;
int hue, saturation, brightness, speed, pairOfLeds;
int var4, var5, var6, var7, var8, var9, varA, varB, varC, varD, varE, varF;
hue = 0;
saturation = 255;
brightness = 85;
speed = 5;
pairOfLeds = 4;
while (1) {
if (Serial.available() > 0) {
int num = Serial.parseInt();
if (num > 0) {
if (num >= 0x000 && num <= 0x0FF) { // 0 - 255
hue = num;
printf_P(PSTR("Befehl:\t0x%03X\nhue:\t%i\n\n"), num, hue);
}
else if (num >= 0x100 && num <= 0x1FF) { // 256 - 511
saturation = num - 0x100;
printf_P(PSTR("Befehl:\t0x%03X\nsaturation:\t%i\n\n"), num, saturation);
}
else if (num >= 0x200 && num <= 0x2FF) { // 512 - 767
brightness = num - 0x200;
printf_P(PSTR("Befehl:\t0x%03X\nbrightness:\t%i\n\n"), num, brightness);
}
else if (num >= 0x300 && num <= 0x3FF) { // 768 - 1023
speed = num - 0x300;
printf_P(PSTR("Befehl:\t0x%03X\nspeed:\t%i\n\n"), num, speed);
}
else if (num >= 0x400 && num <= 0x4FF) { // 1024 - 1279
var4 = num - 0x400;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var4);
}
else if (num >= 0x500 && num <= 0x5FF) { // 1280 - 1535
var5 = num - 0x500;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var5);
}
else if (num >= 0x600 && num <= 0x6FF) { // 1536 - 1791
var6 = num - 0x600;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var6);
}
else if (num >= 0x700 && num <= 0x7FF) { // 1792 - 2047
var7 = num - 0x700;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var7);
}
else if (num >= 0x800 && num <= 0x8FF) { // 2048 - 2303
var7 = num - 0x800;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var8);
}
else if (num >= 0x900 && num <= 0x9FF) { // 2304 - 2559
var7 = num - 0x900;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, var9);
}
else if (num >= 0xA00 && num <= 0xAFF) { // 2560 - 2815
var7 = num - 0xA00;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varA);
}
else if (num >= 0xB00 && num <= 0xBFF) { // 2816 - 3071
var7 = num - 0xB00;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varB);
}
else if (num >= 0xC00 && num <= 0xCFF) { // 3072 - 3327
var7 = num - 0xC00;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varC);
}
else if (num >= 0xD00 && num <= 0xDFF) { // 3328 - 3583
var7 = num - 0xD00;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varD);
}
else if (num >= 0xE00 && num <= 0xEFF) { // 3584 - 3839
var7 = num - 0xE00;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varE);
}
else if (num >= 0xF00 && num <= 0xFFF) { // 3840 - 4095
var7 = num - 0xF00;
printf_P(PSTR("Befehl:\t0x%03X\nvar:\t%i\n\n"), num, varF);
}
else {
printf_P(PSTR("\nBefehl:\t0x%03X\tERROR\n"), num);
printf_P(PSTR("0x1xx:\t Farbton\t(xx = 00-FF)\n"));
printf_P(PSTR("0x2xx:\t Saettigung\t(xx = 00-FF)\n"));
printf_P(PSTR("0x3xx:\t Helligkeit\t(xx = 00-FF)\n"));
printf_P(PSTR("0x4xx:\t Geschwindigk.\t(xx = 00-FF)\n"));
printf_P(PSTR("0x5xx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0x6xx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0x7xx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0x8xx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0x9xx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0xAxx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0xBxx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0xCxx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0xDxx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0xExx:\t ######\t\t(xx = 00-FF)\n"));
printf_P(PSTR("0xFxx:\t ######\t\t(xx = 00-FF)\n"));
}
}
}
rainbow(brightness, speed, var4, 2, pairOfLeds);
}
}
int uart_putchar(char c, FILE *stream) {
Serial.write(c); return 0;
}
void setupLeds(void) {
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
clearLeds();
}
void clearLeds(void) {
memset(leds, 0, NUM_LEDS * 3);
FastLED.show();
}
void rainbow(int brightness, int speed, int width, int direction, int pairOfLeds) {
const int MIN_DURATION = 1E3;
const int MAX_DURATION = 3E4;
const int MIN_SPEED = 1;
const int MAX_SPEED = 5;
const int SATURATION = 255;
if (speed < MIN_SPEED) speed = MIN_SPEED;
else if (speed > MAX_SPEED) speed = MAX_SPEED;
long duration = (speed - MIN_SPEED) * (MIN_DURATION - MAX_DURATION) / (MAX_SPEED - MIN_SPEED) + MAX_DURATION;
int numLeds = NUM_LEDS / pairOfLeds;
if (pairOfLeds > 1) width = width / pairOfLeds;
int hue[NUM_LEDS];
int shift = (255 * millis() / duration) % 255;
if (direction <= 0) {
for (int i = 0; i < numLeds; i++) hue[i] = (i * 255 / width + shift) % 255;
}
else if (direction == 1) {
for (int i = 0; i < numLeds; i++) hue[numLeds - 1 - i] = (i * 255 / width + shift) % 255;
}
else if (direction == 2) {
if (numLeds % 2 == 0) {
for (int i = 0; i < numLeds; i++) {
if (i < numLeds / 2) hue[i] = (i * 255 / width + shift) % 255;
else hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
}
}
else {
for (int i = 0; i < numLeds; i++) {
if (i <= numLeds / 2) hue[i] = (i * 255 / width + shift) % 255;
else hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
}
}
}
else {
if (numLeds % 2 == 0) {
for (int i = 0; i < numLeds; i++) {
if (i < numLeds / 2) hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
else hue[i] = (i * 255 / width + shift) % 255;
}
}
else {
for (int i = 0; i < numLeds; i++) {
if (i <= numLeds / 2) hue[i] = ((numLeds - 1 - i) * 255 / width + shift) % 255;
else hue[i] = (i * 255 / width + shift) % 255;
}
}
}
// Leds setzen
for (int i = 0; i < numLeds; i++) {
int led = i*pairOfLeds;
leds[led] = CHSV(hue[i], SATURATION, brightness);
// Wenn "pairOfLeds" > 1 ist, setzte die benachbarten Leds
for (int j = 1; j < pairOfLeds; j++) leds[led + j] = CHSV(hue[i], SATURATION, brightness);
}
FastLED.show();
}