From 51cdbad84180f2042c58c52d4776aeaa3f92d673 Mon Sep 17 00:00:00 2001 From: fatimaxsen Date: Thu, 24 Apr 2025 11:28:16 +0300 Subject: [PATCH] first upload --- Master/Master.ino | 55 ++++++++++++++++++++++++++++++++++++++++++++++ Slave/Slave.ino | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 Master/Master.ino create mode 100644 Slave/Slave.ino diff --git a/Master/Master.ino b/Master/Master.ino new file mode 100644 index 0000000..2338524 --- /dev/null +++ b/Master/Master.ino @@ -0,0 +1,55 @@ +#include + +#define I2C_DEV_ADDR 0x55 // Must match slave + +void setup() { + Serial.begin(115200); + Wire.begin(); // default pins for ESP32-C3: SDA=8, SCL=9 + Serial.println("Enter number of pixels:"); +} + +void loop() { + static int numPixels = 0; + static bool pixelsSet = false; + + // Step 1: Get number of pixels from user + if (!pixelsSet && Serial.available()) { + numPixels = Serial.parseInt(); + if (numPixels > 0 && numPixels <= 100) { // reasonable limit + Wire.beginTransmission(I2C_DEV_ADDR); + Wire.write(0x01); // Command: set pixel count + Wire.write(numPixels); + Wire.endTransmission(); + pixelsSet = true; + Serial.println("Enter command: (example: ALL 255 0 0 128) or (PIXEL 3 0 255 0 255)"); + Serial.println("Format:"); + Serial.println("ALL R G B I"); + Serial.println("PIXEL N R G B I"); + } else { + Serial.println("Invalid pixel count. Try again."); + } + } + + // Step 2: Get lighting commands from user + if (pixelsSet && Serial.available()) { + String cmd = Serial.readStringUntil('\n'); + cmd.trim(); + + if (cmd.startsWith("ALL")) { + int r, g, b, i; + sscanf(cmd.c_str(), "ALL %d %d %d %d", &r, &g, &b, &i); + Wire.beginTransmission(I2C_DEV_ADDR); + Wire.write(0x02); // Command: set all pixels + Wire.write(r); Wire.write(g); Wire.write(b); Wire.write(i); + Wire.endTransmission(); + } else if (cmd.startsWith("PIXEL")) { + int n, r, g, b, i; + sscanf(cmd.c_str(), "PIXEL %d %d %d %d %d", &n, &r, &g, &b, &i); + Wire.beginTransmission(I2C_DEV_ADDR); + Wire.write(0x03); // Command: set one pixel + Wire.write(n); Wire.write(r); Wire.write(g); Wire.write(b); Wire.write(i); + Wire.endTransmission(); + } + Serial.println("Command sent."); + } +} diff --git a/Slave/Slave.ino b/Slave/Slave.ino new file mode 100644 index 0000000..9854074 --- /dev/null +++ b/Slave/Slave.ino @@ -0,0 +1,56 @@ +#include +#include + +#define I2C_DEV_ADDR 0x55 +#define NEOPIXEL_PIN 19 // Change as needed +#define MAX_PIXELS 100 + +Adafruit_NeoPixel strip(MAX_PIXELS, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800); + +uint8_t pixelCount = 1; + +void receiveEvent(int len) { + delay(50); // Add more delay for stability as requested + + if (len < 1) return; + uint8_t cmd = Wire.read(); + + if (cmd == 0x01 && len >= 2) { // Set pixel count + pixelCount = Wire.read(); + strip.updateLength(pixelCount); + strip.begin(); + strip.show(); + } + else if (cmd == 0x02 && len >= 5) { // Set all pixels: R G B I + uint8_t r = Wire.read(); + uint8_t g = Wire.read(); + uint8_t b = Wire.read(); + uint8_t intensity = Wire.read(); + for (int i = 0; i < pixelCount; i++) { + strip.setPixelColor(i, strip.Color(r * intensity / 255, g * intensity / 255, b * intensity / 255)); + } + strip.show(); + } + else if (cmd == 0x03 && len >= 6) { // Set one pixel: N R G B I + uint8_t n = Wire.read(); + uint8_t r = Wire.read(); + uint8_t g = Wire.read(); + uint8_t b = Wire.read(); + uint8_t intensity = Wire.read(); + if (n < pixelCount) { + strip.setPixelColor(n, strip.Color(r * intensity / 255, g * intensity / 255, b * intensity / 255)); + strip.show(); + } + } +} + +void setup() { + strip.begin(); + strip.show(); + Wire.begin(I2C_DEV_ADDR, 8, 9); // ESP32-S3 default I2C pins: SDA=8, SCL=9 + Wire.onReceive(receiveEvent); +} + +void loop() { + delay(100); // Main loop delay, not critical +}