BERTL17 WS2812B Test

Dependencies:   mbed WS2812 PixelArray

main.cpp

Committer:
EliasN
Date:
2019-04-04
Revision:
3:8b5336449a8a
Parent:
2:f85e3daacaa0

File content as of revision 3:8b5336449a8a:

/*
Name: RGBertil
Beschreibung: WS2812B am Bertl über serielle Schnittstelle kontrollieren
Autor: Elias Nestl
Für: Bulme BERTL17
Klasse: 3BHEL 2018/19
*/

#include "mbed.h"
#include "stdlib.h"
#include "string"
#include "WS2812.h"
#include "PixelArray.h"

// Anzahl der LEDs
#define WS2812_BUF 3

// Serielle Verbindung mit PC herstellen
Serial pc(USBTX, USBRX, 9600);
// Buffer mit 3 Pixeln erstellen (vgl. Grafikspeicher einer Grafikkarte)
PixelArray px(WS2812_BUF);
// WS2812 Libraryobjekt erstellen, an P1_22 hängen die LEDs, die letzten 4 Ziffern sind das Timing
WS2812 ws(P1_22, WS2812_BUF, 0, 5, 5, 0);

// Lesen einer Farbe aus dem Buffer
int getCol(int index) {
    return px.getBuf()[index];
}

// Die Led an "index" auf "color" setzen, "color" im format 0xRRGGBB
void setCol(int index, unsigned int color) {
    // Farbe in den Buffer setzen
    px.Set(index, color);
    // Buffer an LEDs sendern
    ws.write(px.getBuf());
}

// Wie setCol, nur wechselnd (ein wenn aus, aus wenn ein)
void toggleCol(int index, unsigned int color) {
    if (getCol(index) == 0) setCol(index, color);
    else setCol(index, 0);
}

// String vom Serial Port lesen
string readString(char * prompt) {
    string str = "";
    char readc;
    pc.printf("%s> ", prompt);
    while (true) {
        readc = pc.getc(); // Einen Charakter lesen
        if (readc == '\r' || readc == '\n') break; // Aufhören zu lesen bei Enter
        pc.printf("%c", readc); // Rückgabe jedes Buchstabens
        str += readc;
    }
    pc.printf("\n");
    return str;
}

int main()
{
    pc.printf("Hello world!\n");
 
    unsigned int col = 0xff0000; // Standardfarbe = rot
    string s;
    while (true) {
        char c = pc.getc(); // Charakter lesen
        pc.printf("-> %c\n", c); // Gelesenen Charakter ausgeben
        
        switch (c) {
            case '1': // Erste LED schalten
                toggleCol(0, col);
                break;
            case '2': // Zweite LED schalten
                toggleCol(1, col);
                break;
            case '3': // Dritte LED schalten
                toggleCol(2, col);
                break;
            case 's': // Farbe ändern
                s = readString("R"); // Rot einlesen
                col = atoi(s.c_str()) * 256 * 256; // String in integer wandeln und an richtige Stelle bitshiften
                
                s = readString("G"); // Grün einlesen
                col += atoi(s.c_str()) * 256;
                
                s = readString("B"); // Blau einlesen
                col += atoi(s.c_str());
                
                pc.printf("Success!\n");
                break;
            default:
                pc.printf("Unbekannter Befehl!\n");
                break;
        }
    }
}