From e6bde50bf6407bd24af3ea56637acf1c04d2737c Mon Sep 17 00:00:00 2001
From: Benjamin Koch <bbbsnowball@gmail.com>
Date: Sat, 6 May 2023 03:53:01 +0200
Subject: [PATCH] test WS2812

---
 firmware/test1/heizung-test1/platformio.ini |  1 +
 firmware/test1/heizung-test1/src/main.cpp   | 76 +++++++++++++++++++--
 2 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/firmware/test1/heizung-test1/platformio.ini b/firmware/test1/heizung-test1/platformio.ini
index 9c6f98e..b630091 100644
--- a/firmware/test1/heizung-test1/platformio.ini
+++ b/firmware/test1/heizung-test1/platformio.ini
@@ -17,3 +17,4 @@ lib_deps =
 	adafruit/Adafruit SSD1306@^2.5.7
 	sparkfun/SparkFun TMP102 Breakout@^1.1.2
 	adafruit/Adafruit MPR121@^1.1.1
+	adafruit/Adafruit NeoPixel@^1.11.0
diff --git a/firmware/test1/heizung-test1/src/main.cpp b/firmware/test1/heizung-test1/src/main.cpp
index 126e7a9..f4ccf30 100644
--- a/firmware/test1/heizung-test1/src/main.cpp
+++ b/firmware/test1/heizung-test1/src/main.cpp
@@ -4,11 +4,13 @@
 #include <Adafruit_SSD1306.h>
 #include <SparkFunTMP102.h>
 #include <Adafruit_MPR121.h>
+#include <Adafruit_NeoPixel.h>
 
 enum Pinout {
   DRIVE1 = 0,
   DRIVE2 = 1,
   LED_W = 2,
+  WS2812_DISPLAY = 2,
   LED_Y = 3,
   EN_MEASURE_CURRENT = 3,
   LED_B = 4,
@@ -50,12 +52,15 @@ TMP102 sensor0, sensor1;
 Adafruit_MPR121 cap0, cap1;
 bool capAvailable[2];
 
+Adafruit_NeoPixel pixelsDisplay(60, WS2812_DISPLAY, NEO_GRB + NEO_KHZ800);
+Adafruit_NeoPixel pixelsDigout1(2, DIGOUT1, NEO_GRB + NEO_KHZ800);
+
 void setup() {
   rp2040.enableDoubleResetBootloader();
 
   pinMode(DRIVE1, OUTPUT); digitalWrite(DRIVE1, LOW);
   pinMode(DRIVE2, OUTPUT); digitalWrite(DRIVE2, LOW);
-  pinMode(2, OUTPUT);
+  pinMode(WS2812_DISPLAY, OUTPUT);
   pinMode(3, OUTPUT);  digitalWrite(EN_MEASURE_CURRENT, LOW);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
@@ -123,8 +128,15 @@ void setup() {
     // enable X electrodes and start MPR121
     // enable virtual proximity electrode, as well
     cap.writeRegister(MPR121_ECR, 0x8c | 0x30);
-
   }
+
+  pixelsDisplay.begin();
+  pixelsDisplay.clear();
+  pixelsDisplay.show();
+
+  pixelsDigout1.begin();
+  pixelsDigout1.clear();
+  pixelsDigout1.show();
 }
 
 void i2c_scan() {
@@ -177,9 +189,9 @@ void loop() {
     led_state++;
     if (led_state == 8)
       led_state = 2;
-    if (led_state > 2 && led_state-1 != EN_MEASURE_CURRENT)
+    if (led_state > 2 && led_state-1 != EN_MEASURE_CURRENT && led_state-1 != WS2812_DISPLAY)
       digitalWrite(led_state-1, 0);
-    if (led_state <= 6 && led_state != EN_MEASURE_CURRENT)
+    if (led_state <= 6 && led_state != EN_MEASURE_CURRENT && led_state != WS2812_DISPLAY)
       digitalWrite(led_state, 1);
   }
 
@@ -246,7 +258,7 @@ void loop() {
   int displayModePrev = displayMode;
   static bool prevButton4 = 0;
   if (!prevButton4 && buttons[3]) {
-    displayMode = (displayMode + 1) % 6;
+    displayMode = (displayMode + 1) % 7;
   }
   prevButton4 = buttons[3];
 
@@ -261,7 +273,9 @@ void loop() {
     display.setTextColor(SSD1306_WHITE);
     display.setCursor(0, 1);
     display.print(F("ADDR: "));
-    display.println(!digitalRead(BOOT2) ? 'X' : '_');
+    display.print(!digitalRead(BOOT2) ? 'X' : '_');
+    display.print("  ");
+    display.println(digitalRead(WS2811) ? "WS^" : "ws ");
 
     display.print(F("SW:   "));
     for (auto pressed : buttons)
@@ -424,6 +438,56 @@ void loop() {
     display.println(v5);
 
     display.display();
+  } else if (displayMode == 6) {
+    if (displayModePrev != 6) {
+      display.fillRect(0, 0, 128, 64, SSD1306_BLACK);
+      display.drawBitmap(0, 0, logo_data, logo_width, logo_height, SSD1306_WHITE);
+      display.display();
+    }
+  }
+
+  static int digout1_timer = 0;
+  static int digout1_state = 2;
+  if (digout1_timer < 300 || !pixelsDigout1.canShow())
+    digout1_timer++;
+  else {
+    digout1_timer = 0;
+    digout1_state++;
+
+    for (int i=0; i<pixelsDigout1.numPixels(); i++) {
+      switch ((digout1_state-3*i)%8) {
+        case 0:
+          pixelsDigout1.setPixelColor(i, pixelsDigout1.Color(255, 0, 0));
+          break;
+        case 1:
+          pixelsDigout1.setPixelColor(i, pixelsDigout1.Color(0, 255, 0));
+          break;
+        case 2:
+          pixelsDigout1.setPixelColor(i, pixelsDigout1.Color(0, 0, 255));
+          break;
+        default:
+          pixelsDigout1.setPixelColor(i, pixelsDigout1.Color(0, 0, 0));
+          break;
+      }
+    }
+    pixelsDigout1.show();
+  }
+
+  static int ledring_timer = 0;
+  static int ledring_state = 0;
+  if ((ledring_timer < 10 || !pixelsDisplay.canShow()) && 0) {
+    ledring_timer++;
+  } else {
+    ledring_timer = 0;
+    ledring_state += 1;
+
+    for (int i=0; i<pixelsDisplay.numPixels(); i++) {
+      int h = ((ledring_state + 4*i)%(256*4)) * (256/4);
+      int y = ((uint32_t)(i-ledring_state/3))%64 - (int32_t)32;
+      int v = y >= -10 && y <=10 ? 50 : y >= -20 && y < -10 ? (y+20)*5 : y <= 20 && y > 10 ? (20-y)*5 : 0;
+      pixelsDisplay.setPixelColor(i, pixelsDisplay.ColorHSV(h, 255, y <= 1 && y >= -1 && 0 ? 255 : v/16));
+    }
+    pixelsDisplay.show();
   }
 
   delay(1);
-- 
GitLab