// uart-master.ino — Node 0 (master), XIAO RP2040 on my own milled board // Week 11 — three-node UART bus with software addressing (NID). // The master only transmits. It runs a fixed 2 s traffic-light cycle and // sends 6-byte frames to two slaves on a shared TX line. Each slave filters // by DEST_NID in firmware. Serial Monitor (USB) prints every frame as evidence. // --- Node IDs (NID): application-layer addresses, decimal, NOT I2C addresses --- #define NID_MASTER 0 #define NID_RED 1 // slave A, red LED #define NID_GREEN 2 // slave B, green LED // --- Frame --- #define FRAME_START 0xFF #define CMD_LED 0x03 const unsigned long PHASE_MS = 2000; // 2 s per phase unsigned long lastSwitch = 0; bool phaseA = true; void sendFrame(uint8_t dest, uint8_t cmd, uint8_t payload) { uint8_t checksum = dest ^ NID_MASTER ^ cmd ^ payload; Serial1.write(FRAME_START); Serial1.write(dest); Serial1.write((uint8_t)NID_MASTER); Serial1.write(cmd); Serial1.write(payload); Serial1.write(checksum); // Evidence on the USB Serial Monitor Serial.print("TX DEST_NID="); Serial.print(dest); Serial.print(" CMD=0x"); Serial.print(cmd, HEX); Serial.print(" PAYLOAD="); Serial.println(payload); } void setup() { Serial.begin(9600); // USB, monitor Serial1.begin(9600); // UART bus, TX = GP0 (D6), RX = GP1 (D7, unused here) unsigned long t0 = millis(); while (!Serial && millis() - t0 < 3000) {} Serial.println("Master (NID 0) ready. Traffic-light loop on the UART bus."); } void loop() { unsigned long now = millis(); if (now - lastSwitch >= PHASE_MS) { lastSwitch = now; if (phaseA) { Serial.println("-- phase A: RED on, GREEN off --"); sendFrame(NID_RED, CMD_LED, 1); sendFrame(NID_GREEN, CMD_LED, 0); } else { Serial.println("-- phase B: RED off, GREEN on --"); sendFrame(NID_RED, CMD_LED, 0); sendFrame(NID_GREEN, CMD_LED, 1); } phaseA = !phaseA; } }