Add controller code for Kanako

This commit is contained in:
Leni Aniva 2025-06-10 00:53:41 -07:00
parent 52b4e0b329
commit 675f4f995b
Signed by: aniva
GPG Key ID: D5F96287843E8DFB
1 changed files with 199 additions and 0 deletions

View File

@ -0,0 +1,199 @@
#define USE_MOTOR 1
#define USE_LED 1
#define USE_DISPLAY 1
#define pinButtonMode 9
#define pinDiag 6
// Main LED strip setup
#define pinLED 3
#define NUM_LEDS 20
#define LED_PART 10
#define BRIGHTNESS 250
#define LED_TYPE WS2811
// Relay controlled motor
#define pinMotor 7
#if USE_LED
#include <FastLED.h>
int cycles = 100;
int cycle_duration = 100;
CRGB leds[NUM_LEDS];
CRGB color_red;
CRGB color_blue;
CRGB color_green;
#endif
#if USE_DISPLAY
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#endif
// Program state
bool stateButtonMode = false;
int programId = 0;
bool programChanged = true;
#define MAX_PROGRAMS 3
bool flag_motor = false;
bool flag_lighting = false;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(pinButtonMode, INPUT);
#if USE_LED
// Calculate colours
hsv2rgb_spectrum(CHSV(4, 255, 100), color_red);
hsv2rgb_spectrum(CHSV(170, 255, 100), color_blue);
hsv2rgb_spectrum(CHSV(90, 255, 100), color_green);
pinMode(pinLED, OUTPUT);
#endif
pinMode(pinDiag, OUTPUT);
#if USE_MOTOR
pinMode(pinMotor, OUTPUT);
#endif
#if USE_LED
// Main LED strip
FastLED.addLeds<LED_TYPE, pinLED, RGB>(leds, NUM_LEDS);
#endif
#if USE_DISPLAY
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
pinMode(pinLED, OUTPUT);
digitalWrite(pinLED, HIGH);
}
#endif
}
void loop() {
int buttonState = digitalRead(pinButtonMode);
if (buttonState && !stateButtonMode) {
programId = (programId + 1) % MAX_PROGRAMS;
programChanged = true;
stateButtonMode = true;
}
if (!buttonState) {
stateButtonMode = false;
}
switch (programId)
{
case 0:
program_off();
break;
case 1:
program_still();
break;
case 2:
program_rotate();
break;
default:
break;
}
if (programChanged) {
update_screen();
programChanged = false;
}
}
// Utility for updating LEDs
void fill_segmented(CRGB c1, CRGB c2)
{
#if USE_LED
//fill_solid(leds, LED_PART, c1);
fill_gradient_RGB(leds, LED_PART, CRGB::Black ,c1);
fill_gradient_RGB(leds + LED_PART, NUM_LEDS - LED_PART, CRGB::Black, c2);
FastLED.show();
#endif
}
void set_motor(bool flag)
{
#if USE_MOTOR
if (flag) {
digitalWrite(pinMotor, HIGH);
flag_motor = true;
}
else {
digitalWrite(pinMotor, LOW);
flag_motor = false;
}
#endif
}
// Update current display status
void update_screen()
{
#if USE_DISPLAY
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Yasaka K.");
display.print("P");
display.print(programId);
display.print(" ");
if (flag_motor) {
display.print("M");
}
if (flag_lighting) {
display.print("L");
}
display.display();
#endif
}
void program_off()
{
if (programChanged)
{
set_motor(false);
#if USE_LED
flag_lighting = false;
fill_solid(leds, NUM_LEDS, CRGB::Black);
FastLED.show();
#endif
}
}
void program_still()
{
if (programChanged)
{
set_motor(false);
#if USE_LED
flag_lighting = true;
fill_segmented(CRGB::Green, CRGB::Orange);
FastLED.show();
#endif
}
}
void program_rotate()
{
if (programChanged)
{
set_motor(true);
}
#if USE_LED
flag_lighting = true;
fill_segmented(CRGB::Green, CRGB::Orange);
delay(cycle_duration/2);
fill_solid(leds, NUM_LEDS, CRGB::Black);
FastLED.show();
delay(cycle_duration/2);
#endif
}