#include // Biblioteca pentru comunicarea I2C #include // Biblioteca pentru afișajul LCD I2C // Definirea adresei slave a plăcii Arduino 2 #define SLAVE_ADDRESS 9 // Definirea pinilor pentru seturile de LED-uri IR și fototranzistoare #define LED1_PIN 2 #define LED2_PIN 3 #define LED3_PIN 4 #define PHOTOTRANSISTOR1_PIN A0 #define PHOTOTRANSISTOR2_PIN A1 #define PHOTOTRANSISTOR3_PIN A2 // Definirea adresei și dimensiunii LCD-ului #define LCD_ADDRESS 0x27 #define LCD_COLUMNS 16 #define LCD_ROWS 2 // Inițializarea obiectului pentru controlul LCD-ului LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS); // Variabile pentru stocarea stării LED-urilor și fototranzistoarelor bool led1State = false; bool led2State = false; bool led3State = false; int photocellState = 0; // Funcție pentru a trimite date către placa Arduino 1 void sendDataToMaster(int fillLevel) { Wire.beginTransmission(1); // Începe transmiterea către adresa master (1) Wire.write(fillLevel); // Trimite nivelul de umplere către master Wire.endTransmission(); // Termină transmisia } // Funcție pentru citirea stării fototranzistoarelor și actualizarea nivelului de umplere int readPhotocellState() { int photocell1 = analogRead(PHOTOTRANSISTOR1_PIN); int photocell2 = analogRead(PHOTOTRANSISTOR2_PIN); int photocell3 = analogRead(PHOTOTRANSISTOR3_PIN); // Verifică starea fototranzistoarelor și actualizează nivelul de umplere corespunzător if (photocell1 < 1000 && photocell2 < 1000 && photocell3 < 1000) { return 100; // Toate cele 3 seturi sunt opturate } else if (photocell1 < 1000 && photocell2 < 1000) { return 50; // Primul și al doilea set sunt opturate } else if (photocell1 < 1000) { return 0; // Doar primul set este opturat } else { return -1; // Niciun set nu este opturat } } // Funcție pentru actualizarea stării LED-urilor IR void updateLEDState(int fillLevel) { if (fillLevel == 100) { led1State = true; led2State = true; led3State = true; } else if (fillLevel == 50) { led1State = true; led2State = false; led3State = false; } else if (fillLevel == 0) { led1State = false; led2State = false; led3State = false; } // Actualizează starea LED-urilor digitalWrite(LED1_PIN, led1State); digitalWrite(LED2_PIN, led2State); digitalWrite(LED3_PIN, led3State); } // Funcție pentru tratarea cererilor primite de la placa Arduino 1 void receiveDataFromMaster(int byteCount) { while (Wire.available()) { int fillLevel = Wire.read(); // Citește nivelul de umplere de la master // Actualizează starea LED-urilor și trimite nivelul de umplere la LCD updateLEDState(fillLevel); lcd.setCursor(0, 1); lcd.print(fillLevel); lcd.print("% umplere"); } } // Funcție pentru inițializarea comunicării I2C și configurația inițială void setup() { Wire.begin(SLAVE_ADDRESS); // Inițializează comunicarea I2C ca slave lcd.begin(LCD_COLUMNS, LCD_ROWS); // Inițializează LCD-ul lcd.backlight(); // Activează iluminarea de fundal a LCD-ului // Setează pinii LED-urilor și fototranzistoarelor ca ieșiri/ieșiri analogice pinMode(LED1_PIN, OUTPUT); pinMode(LED2_PIN, OUTPUT); pinMode(LED3_PIN, OUTPUT); pinMode(PHOTOTRANSISTOR1_PIN, INPUT); pinMode(PHOTOTRANSISTOR2_PIN, INPUT); pinMode(PHOTOTRANSISTOR3_PIN, INPUT); // Inițializează starea LED-urilor updateLEDState(-1); // Setează funcțiile de tratare a cererilor primite și trimite date către placa Arduino 1 Wire.onReceive(receiveDataFromMaster); Wire.onRequest(sendDataToMaster); } void loop() { // Citeste starea fototranzistoarelor si actualizeaza nivelul de umplere int newPhotocellState = readPhotocellState(); // Daca starea fototranzistoarelor s-a schimbat, trimite nivelul de umplere la master if (newPhotocellState != photocellState) { photocellState = newPhotocellState; sendDataToMaster(photocellState); } delay(100); // O pauza mica pentru a evita bucla while infinita }