Files
Arduino/ESP32/StadlerHomeKitUpgrade/StadlerHomeKitUpgrade.ino
2025-06-23 21:19:07 +02:00

333 lines
9.9 KiB
C++

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"
#include <Adafruit_NeoPixel.h>
#include <BH1750.h>
#define Version "0.2.2"
#define LED_PIN 5
#define LED_COUNT 9
const uint8_t ledMap[LED_COUNT] = {3, 0, 1, 8, 2, 5, 4, 7, 6};
//2DO:
//pomiary i dobor rezystorów dla ledów w zbiorniku
// zacząć pomiary pojemności
//Pomiar światła bh1750 i fotorezystor
#define NUMPIXELS 10 //docelowo 9-10
#define DHTTYPE DHT22
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
//PINS
#define BTN_DIMM 34 //GPIO34 D34
#define BTN_RST 35 //GPIO35 D35
#define BTN_HYGRSTT 36 //GPIO36 VP
#define BTN_SPEED 39 //GPIO35 VN
#define PIN_SPEED_1 32 //GPIO32 D32
#define PIN_SPEED_2 14 //GPIO36 D14
#define DHTPIN 4 //GPIO04 D4
#define LED_WHT_TANK 26 //GPIO26 D26
#define LED_RED_TANK 25 //GPIO25 D25
#define NEOPIXEL 27 //GPIO04 D27
#define IN_PHOTOTRA 12
#define WTR_LVL 33 //GPIO04 D27
//NEO PIXEL ARDESES:
#define NEOPXL_MULTIPLIER 25
// ARDESES:
#define ADR_NEOPXL_SPEED_2 0
#define ADR_NEOPXL_SPEED_1 1
#define ADR_NEOPXL_FILTER 2
#define ADR_NEOPXL_L1 3
#define ADR_NEOPXL_L2 4
#define ADR_NEOPXL_L3 5
#define ADR_NEOPXL_L4 6
#define ADR_NEOPXL_L5 7
#define ADR_NEOPXL_WATERLVL 8
#define ADR_NEOPXL_TANK 9
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_NeoPixel pixels(NUMPIXELS, NEOPIXEL, NEO_GRB + NEO_KHZ800);
DHT dht(DHTPIN, DHTTYPE);
BH1750 lightMeter;
//MAIN VALUES VARIABLES
int8_t resetVal = 0;
int8_t fanSpeedVal = 0;
int8_t hygrostatVal = 55;
int8_t dimmVal = 10;
int8_t waterLvlVal = 0;
float temp = 0.0;
float hum = 0.0;
//NEOPIXELS VARIABLES
int8_t neoPixelSwitch = 1;
int8_t neoPixelRed = 5;
int8_t neoPixelGreen = 5;
int8_t neoPixelBlue = 5;
int8_t neoPixelSpeed_1 = 1;
int8_t neoPixelSpeed_2 = 1;
int8_t neoPixelFilter = 1;
int8_t neoPixelLvl_1 = 1;
int8_t neoPixelLvl_2 = 1;
int8_t neoPixelLvl_3 = 1;
int8_t neoPixelLvl_4 = 1;
int8_t neoPixelLvl_5 = 1;
int8_t neoPixelWaterLvl = 1;
int8_t neoPixelTank = 1;
void IRAM_ATTR dimmButtonFcn() {
dimmVal ++;
if (dimmVal >= 11) {
dimmVal = 1;
}
digitalWrite(LED_WHT_TANK, HIGH);
}
void IRAM_ATTR speedButtonFcn() {
fanSpeedVal ++;
if (fanSpeedVal >= 3) {
fanSpeedVal = 0;
}
digitalWrite(LED_RED_TANK, HIGH);
}
void IRAM_ATTR hygrostatButtonFcn() {
hygrostatVal = hygrostatVal + 10;
if (hygrostatVal >= 75) {
hygrostatVal = 35;
}
}
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for (j = 0; j < 256 * 3; j++) { // mniej cykli niż 5 — szybciej wraca
for (i = 0; i < LED_COUNT; i++) {
uint8_t physIndex = ledMap[i]; // mapowanie pozycji logicznej na fizyczną
pixels.setPixelColor(physIndex, Wheel((i * 256 / LED_COUNT + j) & 255));
}
pixels.show();
delay(wait);
}
}
uint32_t Wheel(byte pos) {
pos = 255 - pos;
uint8_t r, g, b;
if (pos < 85) {
r = 255 - pos * 3;
g = 0;
b = pos * 3;
} else if (pos < 170) {
pos -= 85;
r = 0;
g = pos * 3;
b = 255 - pos * 3;
} else {
pos -= 170;
r = pos * 3;
g = 255 - pos * 3;
b = 0;
}
// Ogranicz jasność do 30%
r = r * 30 / 100;
g = g * 30 / 100;
b = b * 30 / 100;
return pixels.Color(r, g, b);
}
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
}
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.clearDisplay();
display.setCursor(0, 0);
display.println("Version:");
display.setCursor(60, 0);
display.println(Version);
display.display();
delay(500);
pinMode(BTN_RST, INPUT);
pinMode(BTN_DIMM, INPUT);
pinMode(BTN_SPEED, INPUT);
pinMode(BTN_HYGRSTT, INPUT);
pinMode(PIN_SPEED_1, OUTPUT);
pinMode(PIN_SPEED_2, OUTPUT);
pinMode(LED_RED_TANK, OUTPUT);
pinMode(LED_WHT_TANK, OUTPUT);
pinMode(IN_PHOTOTRA, INPUT_PULLDOWN);
pinMode(WTR_LVL, INPUT);
attachInterrupt(digitalPinToInterrupt(BTN_DIMM), dimmButtonFcn, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN_SPEED), speedButtonFcn, FALLING);
attachInterrupt(digitalPinToInterrupt(BTN_HYGRSTT), hygrostatButtonFcn, FALLING);
Wire.begin();
lightMeter.begin();
dht.begin();
pixels.begin();
}
void loop() {
delay(50);
display.clearDisplay();
display.setCursor(90, 0);
display.println(Version);
display.setCursor(0, 0);
display.println("RST:");
display.setCursor(25, 0);
display.println(resetVal);
display.setCursor(35, 0);
display.println("L:");
display.setCursor(47, 0);
float lux = lightMeter.readLightLevel();
display.println(lux);
int waterLvlVal = touchRead(WTR_LVL);
display.setCursor(0, 10);
display.println("WtrLvl:");
display.setCursor(50, 10);
display.println(waterLvlVal);
// waterLvlVal > 45 znnaczy bez wiody
// display.setCursor(0, 10);
// display.println("FanSpd:");
// display.setCursor(50, 10);
// display.println(fanSpeedVal);
// display.setCursor(0, 10);
// display.println("FanSpd:");
// display.setCursor(50, 10);
// display.println(fanSpeedVal);
//
// display.setCursor(70, 10);
// display.println("Hygst:");
// display.setCursor(115, 10);
// display.println(hygrostatVal);
hum = (dht.readHumidity());
// display.setCursor(0, 20);
// display.println("Hum:");
// display.setCursor(28, 20);
// display.println(hum);
int photoVal = analogRead(IN_PHOTOTRA);
display.setCursor(0, 20);
display.println("Ph:");
display.setCursor(28, 20);
display.println(photoVal);
display.setCursor(70, 20);
display.println("Dimm:");
display.setCursor(115, 20);
display.println(dimmVal);
delay(50);
display.display();
// #################################################################
// #################################################################
//NEOPIXELS
// #################################################################
// #################################################################
pixels.clear();
// pixels.setPixelColor(ADR_NEOPXL_SPEED_2, pixels.Color(0, 50, 0));
// pixels.setPixelColor(ADR_NEOPXL_SPEED_1, pixels.Color(50, 0, 0));
// pixels.setPixelColor(2, pixels.Color(50, 0, 0));
// pixels.setPixelColor(3, pixels.Color(50, 0, 0));
// pixels.setPixelColor(4, pixels.Color(50, 0, 0));
// pixels.setPixelColor(5, pixels.Color(50, 0, 0));
// pixels.setPixelColor(6, pixels.Color(50, 0, 0));
// pixels.setPixelColor(7, pixels.Color(50, 0, 0));
// pixels.setPixelColor(8, pixels.Color(50, 0, 0));
rainbowCycle(10); // im mniejsza liczba, tym szybsza animacja
// pixels.setPixelColor(ADR_NEOPXL_SPEED_1, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelSpeed_1, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelSpeed_1, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelSpeed_1));
// pixels.setPixelColor(ADR_NEOPXL_SPEED_2, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelSpeed_2, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelSpeed_2, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelSpeed_2));
// pixels.setPixelColor(ADR_NEOPXL_FILTER, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelFilter, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelFilter, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelFilter));
// pixels.setPixelColor(ADR_NEOPXL_L1, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelLvl_1, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelLvl_1, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelLvl_1));
// pixels.setPixelColor(ADR_NEOPXL_L2, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelLvl_2, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelLvl_2, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelLvl_2));
// pixels.setPixelColor(ADR_NEOPXL_L3, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelLvl_3, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelLvl_3, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelLvl_3));
// pixels.setPixelColor(ADR_NEOPXL_L4, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelLvl_4, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelLvl_4, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelLvl_4));
// pixels.setPixelColor(ADR_NEOPXL_L5, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelLvl_5, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelLvl_5, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelLvl_5));
// pixels.setPixelColor(ADR_NEOPXL_WATERLVL, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelWaterLvl, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelWaterLvl, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelWaterLvl));
// pixels.setPixelColor(ADR_NEOPXL_TANK, pixels.Color(neoPixelRed*dimmVal*neoPixelSwitch*neoPixelTank, neoPixelGreen*dimmVal*neoPixelSwitch*neoPixelTank, neoPixelBlue*dimmVal*neoPixelSwitch*neoPixelTank));
// pixels.show();
if (digitalRead(BTN_RST) == HIGH) {
unsigned long startTime = millis();
while (digitalRead(BTN_RST) == HIGH && millis() - startTime < 4000) {
display.clearDisplay();
display.setCursor(20, 0);
display.println("Resetowanie... 4s");
display.display();
delay(100);
}
if (digitalRead(BTN_RST) == HIGH) {
resetVal = 1;
display.clearDisplay();
display.setCursor(0, 0);
display.println("Zresetowano");
display.display();
delay(500);
}
}
delay(500);
// digitalWrite(LED_WHT_TANK, LOW);
// digitalWrite(LED_RED_TANK, LOW);
// digitalWrite(PIN_SPEED_1, LOW);
// digitalWrite(PIN_SPEED_2, LOW);
}