//reference: https://blog.codebender.cc/2014/01/30/mux74hc4067/
// Include the library code:
#include <LiquidCrystal_I2C.h>
#include <light_CD74HC4067.h>
// #include <MUX74HC4067.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define UPDATE_INTERVAL 1 // Time is seconds
int menuIndex = 0;
const int s0Pin = 8; // S0 pin
const int s1Pin = 9; // S1 pin
const int s2Pin = 10; // S2 pin
const int s3Pin = 11; // S3 pin
const int signal_pin = 4; // Pin 3 - Connected to Sig pin of CD74HC4067
unsigned long prevMillis = 0;
CD74HC4067 mux(s0Pin, s1Pin, s2Pin, s3Pin);
// MUX74HC4067 mux(7, 8, 9, 10, 11);
void setup()
{
Serial.begin(9600);
// mux.signalPin(3, INPUT, DIGITAL);
pinMode(signal_pin, INPUT); // Set as input for reading through signal pin
pinMode(s0Pin, OUTPUT); // Set addressing pins as outputs
pinMode(s1Pin, OUTPUT);
pinMode(s2Pin, OUTPUT);
pinMode(s3Pin, OUTPUT);
lcd.init();
lcd.backlight();
prevMillis = (millis() - (UPDATE_INTERVAL * 1000UL));
Serial.print("prevMillis: ");
Serial.println(prevMillis);
}
uint8_t i = 0;
int channel_address_table[16][4] = {
// s0, s1, s2, s3 channel
{0, 0, 0, 0}, // 0
{1, 0, 0, 0}, // 1
{0, 1, 0, 0}, // 2
{1, 1, 0, 0}, // 3
{0, 0, 1, 0}, // 4
{1, 0, 1, 0}, // 5
{0, 1, 1, 0}, // 6
{1, 1, 1, 0}, // 7
{0, 0, 0, 1}, // 8
{1, 0, 0, 1}, // 9
{0, 1, 0, 1}, // 10
{1, 1, 0, 1}, // 11
{0, 0, 1, 1}, // 12
{1, 0, 1, 1}, // 13
{0, 1, 1, 1}, // 14
{1, 1, 1, 1} // 15
};
void Mux_Addr (int ch_Addr)
{
digitalWrite(s0Pin, channel_address_table[ch_Addr][0]);
digitalWrite(s1Pin, channel_address_table[ch_Addr][1]);
digitalWrite(s2Pin, channel_address_table[ch_Addr][2]);
digitalWrite(s3Pin, channel_address_table[ch_Addr][3]);
Serial.print("Address: ");
Serial.print(String(channel_address_table[ch_Addr][0]));
Serial.print(String(channel_address_table[ch_Addr][1]));
Serial.print(String(channel_address_table[ch_Addr][2]));
Serial.println(String(channel_address_table[ch_Addr][3]));
delay(10); // Adding a small delay for stability
}
void loop()
{
// byte data;
// mux.channel(0);
// delay(100); // Adding a small delay for stability
// int data = digitalRead(signal_pin);
// Serial.print("Push button at channel ");
// Serial.print(0);
// Serial.print(" is: ");
// Serial.print(data);
for (byte i = 0; i < 16; ++i)
{
// Reads from channel i and returns HIGH or LOW
// data = mux.read(i);
// mux.channel(i);
Mux_Addr (i);
delay(100); // Adding a small delay for stability
int data = digitalRead(signal_pin);
Serial.print("Push button at channel ");
Serial.print(i);
Serial.print(" is: ");
Serial.print(data);
if ( data == LOW ){
Serial.println(" - not pressed");
menuIndex = 99;
}
else if ( data == HIGH ){
Serial.println(" - pressed");
menuIndex = i;
// break;
}
}
Serial.println("---------------");
Serial.print(menuIndex);
Serial.println(" - Menu Selected");
Serial.println("---------------");
switch (menuIndex)
{
case 0 : screenArgentina(); break;
case 1 : screenBolivia(); break;
case 2 : screenBrasil(); break;
case 3 : screenChile(); break;
case 4 : screenColombia(); break;
case 5 : screenGuiana(); break;
case 6 : screenEquador(); break;
case 7 : screenParaguai(); break;
case 8 : screenPeru(); break;
case 9 : screenSuriname(); break;
case 10 : screenUruguai(); break;
case 11 : screenVenezuela(); break;
default:
{
if ((millis() - prevMillis) > (UPDATE_INTERVAL * 1000UL))
{
lcd.setCursor(0, 0);
lcd.print("StartMenu");
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
prevMillis = millis();
}
break;
}
}
}
void screenArgentina() {
lcd.clear();
lcd.print(F("Argentina"));
delay(3000); // Adding a small delay for stability
}
void screenBolivia() {
lcd.clear();
lcd.print(F("Bolivia"));
}
void screenBrasil() {
lcd.clear();
lcd.print(F("Brasil"));
}
void screenChile() {
lcd.clear();
lcd.print(F("Chile"));
}
void screenColombia() {
lcd.clear();
lcd.print(F("Colombia"));
}
void screenGuiana() {
lcd.clear();
lcd.print(F("Guiana"));
}
void screenEquador() {
lcd.clear();
lcd.print(F("Equador"));
}
void screenParaguai() {
lcd.clear();
lcd.print(F("Paraguai"));
}
void screenPeru() {
lcd.clear();
lcd.print(F("Peru"));
}
void screenSuriname() {
lcd.clear();
lcd.print(F("Suriname"));
}
void screenUruguai() {
lcd.clear();
lcd.print(F("Uruguai"));
}
void screenVenezuela() {
lcd.clear();
lcd.print(F("Venezuela"));
}Loading
cd74hc4067
cd74hc4067