7.10.22
I am reconnecting the I2C LCD screens to the Raspberry PI 4B.
From Left to Right
Raspberry Pi 4B 8GB with T-Cobbler
Bi directional Logic Level Converter (BD-LLC), little red IC
Arduino 4: Arduino Hero (Arduino master until BD-LLC is configured)
Arduino 5: Arduino Hero
Arduino 6: Arduino Hero
Arduino 7: Arduino Mega 2560
Arduino 8: Arduino Mega Wifi
Arduino 9: Arduino Uno R3
Arduino 10: Arduino Hero
Arduino 11: Arduino Hero
Arduino 12: Arduino Hero
You can see the I2C LCD addresses at 24 and 27.
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — —
10: — — — — 14 15 16 17 18 19 1a 1b 1c — — —
20: — — — — 24 — — 27 — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — —
LCD 0x24 is displaying information from each Arduino to Raspberry PI that has each of the 9 Arduino devices checking in.
INO files for Arduino device
Arduino 5
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x15); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino 6
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x16); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino Mega 7
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x17); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino Mega Wifi 8
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x18); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino 9
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x19); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino 10
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x1a); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino 11
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x1b); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino 12
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x1c); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Arduino 4 Slave
// Wire Slave Receiver // by Nicholas Zambetti <http://www.zambetti.com> // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain. // 04-Feb-2018 mcarter adapted #include <Wire.h> const int ledPin = 13; // onboard LED int ValueA3 = 0; static_assert(LOW == 0, "Expecting LOW to be 0"); int Checking_In = 1; void setup() { Serial.begin(9600); Wire.begin(0x14); // join i2c bus with address #4 Wire.onReceive(receiveEvent); // register event Wire.onRequest(requestEvent); // send date to Pi Wire.onRequest(ard_checkingIn); // send date to Pi pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); // turn it off } void loop() { delay(100); } // function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent() { while (Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character digitalWrite(ledPin, c); } } void requestEvent() { } void ard_checkingIn() { Wire.write(Checking_In); }
Raspberry Pi Python File
#! /usr/bin/env python3 #include <iostream> #include <wiringPiI2C.h> import time from smbus import SMBus from array import * import I2C_LCD_driver_24 import I2C_LCD_driver_27 ard_addr = bytearray([0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c]) dev_name = ['14', '15', '16', '17', '18', '19', '1a', '1b', '1c'] number = bytearray([0, 0, 0, 0, 0, 0, 0, 0, 0]) check_in = [0, 0, 0, 0, 0, 0, 0, 0, 0] lcd_24_screen_format = [ [1,0,1,2,1,3], [2,0,2,2,2,3], [3,0,3,2,3,3], [4,0,4,2,4,3], [1,5,1,7,1,8], [2,5,2,7,2,8], [3,5,3,7,3,8], [4,5,4,7,4,8], [1,10,1,12,1,13] ] bus = SMBus(1) # indicates /dev/ic2-1 lcd_24 = I2C_LCD_driver_24.lcd() lcd_27 = I2C_LCD_driver_27.lcd() cnt = 0 check_in_answer = "" while True: lcd_24.lcd_clear() while cnt < 9: check_in[cnt] = bus.read_byte(ard_addr[cnt]) print("Arduino", dev_name[cnt], "reporting in", check_in[cnt]) bus.write_byte(ard_addr[cnt], 0x1) # switch it on time.sleep(2) bus.write_byte(ard_addr[cnt], 0x0) # switch it on str_addr = "{}".format(dev_name[cnt]) str_check_in = "{}".format(check_in[cnt]) lcd_24.lcd_display_string(str_addr, lcd_24_screen_format[cnt][0], lcd_24_screen_format[cnt][1]) lcd_24.lcd_display_string(": ", lcd_24_screen_format[cnt][2], lcd_24_screen_format[cnt][3]) if (str_check_in == "1"): check_in_answer = "Y" elif (str_check_in == "0"): check_in_answer = "N" lcd_24.lcd_display_string(check_in_answer, lcd_24_screen_format[cnt][4], lcd_24_screen_format[cnt][5]) cnt +=1 time.sleep(3) cnt = 0 print(" ")