Moirtz Wagner 379b4887c3 Update housing and code
--add local timezone
--add sunrise/sunset calculation and LED illumination accordingly
--remove touch sensor check
--change mqtt messages
2025-05-13 19:07:14 +02:00

135 lines
4.6 KiB
C++

/*************************************************************
digitalReadInterrupt.ino
SparkFun SX1509 I/O Expander Example: digital in w/ interrupt
Jim Lindblom @ SparkFun Electronics
Original Creation Date: September 21, 2015
https://github.com/sparkfun/SparkFun_SX1509_Arduino_Library
This example combines the SX1509's digitalRead and interrupt
output functionalities. When a button connected to pin 0 is
pressed, the SX1509 will generate an active-low interrupt,
signalling to the Arduino that a button has been pressed.
After uploading the sketch, open your serial monitor and
set it to 115200 baud.
Hardware Hookup:
SX1509 Breakout ------ Arduino -------- Breadboard
INT --------------- 2
GND -------------- GND
3V3 -------------- 3.3V
SDA ------------ SDA (A4)
SCL ------------ SCL (A5)
0 ---------------------------------BTN----GND
Development environment specifics:
IDE: Arduino 1.6.5
Hardware Platform: Arduino Uno
SX1509 Breakout Version: v2.0
This code is beerware; if you see me (or any other SparkFun
employee) at the local, and you've found our code helpful,
please buy us a round!
Distributed as-is; no warranty is given.
*************************************************************/
#include <Wire.h> // Include the I2C library (required)
#include <SparkFunSX1509.h> //Click here for the library: http://librarymanager/All#SparkFun_SX1509
// SX1509 I2C address (set by ADDR1 and ADDR0 (00 by default):
const byte SX1509_ADDRESS = 0x3E; // SX1509 I2C address
SX1509 io; // Create an SX1509 object to be used throughout
// SX1509 Pins:
const byte SX1509_BUTTON_PIN = 0; // IO 0 connected to button
// Arduino Pins (not SX1509!)
const byte ARDUINO_INT_PIN = 2; // SX1509 int output to D2
// Global variables:
bool buttonPressed = false; // Track button press in ISR
void setup()
{
// Serial is used in this example to display the input
// value of the SX1509_INPUT_PIN input:
Serial.begin(115200);
Serial.println("SX1509 Example");
Wire.begin();
// Call io.begin(<address>) to initialize the SX1509. If
// it successfully communicates, it'll return 1.
if (io.begin(SX1509_ADDRESS) == false)
{
Serial.println("Failed to communicate. Check wiring and address of SX1509.");
while (1)
; // If we fail to communicate, loop forever.
}
// Use io.pinMode(<pin>, <mode>) to set our button to an
// input with internal pullup resistor activated:
io.pinMode(SX1509_BUTTON_PIN, INPUT_PULLUP);
// Use io.enableInterrupt(<pin>, <signal>) to enable an
// interrupt on a pin. The <signal> variable can be either
// FALLING, RISING, or CHANGE. Set it to falling, which will
// mean the button was pressed:
io.enableInterrupt(SX1509_BUTTON_PIN, FALLING);
// The SX1509 has built-in debounce features, so a single
// button-press doesn't accidentally create multiple ints.
// Use io.debounceTime(<time_ms>) to set the GLOBAL SX1509
// debounce time.
// <time_ms> can be either 0, 1, 2, 4, 8, 16, 32, or 64 ms.
io.debounceTime(32); // Set debounce time to 32 ms.
// After configuring the debounce time, use
// debouncePin(<pin>) to enable debounce on an input pin.
io.debouncePin(SX1509_BUTTON_PIN); // Enable debounce
// Don't forget to configure your Arduino pins! Set the
// Arduino's interrupt input to INPUT_PULLUP. The SX1509's
// interrupt output is active-low.
pinMode(ARDUINO_INT_PIN, INPUT_PULLUP);
// Attach an Arduino interrupt to the interrupt pin. Call
// the button function, whenever the pin goes from HIGH to
// LOW.
attachInterrupt(digitalPinToInterrupt(ARDUINO_INT_PIN),
button, FALLING);
}
void loop()
{
if (buttonPressed) // If the button() ISR was executed
{
// read io.interruptSource() find out which pin generated
// an interrupt and clear the SX1509's interrupt output.
unsigned int intStatus = io.interruptSource();
// For debugging handiness, print the intStatus variable.
// Each bit in intStatus represents a single SX1509 IO.
Serial.println("intStatus = " + String(intStatus, BIN));
// If the bit corresponding to our button IO generated
// the input:
if (intStatus & (1 << SX1509_BUTTON_PIN))
{
Serial.println("Button pressed!"); // Print a message.
}
buttonPressed = false; // Clear the buttonPressed flag
}
}
// button() is an Arduino interrupt routine, called whenever
// the interrupt pin goes from HIGH to LOW.
void button()
{
buttonPressed = true; // Set the buttonPressed flag to true
// We can't do I2C communication in an Arduino ISR. The best
// we can do is set a flag, to tell the loop() to check next
// time through.
}