/** * * @license MIT License * * Copyright (c) 2024 lewis he * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * @file XL9555_ioEvent.ino * @author Lewis He (lewishe@outlook.com) * @date 2024-09-14 * */ #include #include "ExtensionIOXL9555.hpp" #ifndef SENSOR_SDA #define SENSOR_SDA 17 #endif #ifndef SENSOR_SCL #define SENSOR_SCL 18 #endif #ifndef SENSOR_IRQ #define SENSOR_IRQ 10 #endif ExtensionIOXL9555 io; void gpio5_event_cb(void *user_data) { Serial.println((const char *)user_data); } void gpio7_event_cb(void *user_data) { Serial.println((const char *)user_data); } void setup() { Serial.begin(115200); // Set the interrupt input to input pull-up pinMode(SENSOR_IRQ, INPUT_PULLUP); /* * * If the device address is not known, the 0xFF parameter can be passed in. * * XL9555_UNKOWN_ADDRESS = 0xFF * * If the device address is known, the device address is given * * XL9555_SLAVE_ADDRESS0 = 0x20 * XL9555_SLAVE_ADDRESS1 = 0x21 * XL9555_SLAVE_ADDRESS2 = 0x22 * XL9555_SLAVE_ADDRESS3 = 0x23 * XL9555_SLAVE_ADDRESS4 = 0x24 * XL9555_SLAVE_ADDRESS5 = 0x25 * XL9555_SLAVE_ADDRESS6 = 0x26 * XL9555_SLAVE_ADDRESS7 = 0x27 */ const uint8_t chip_address = XL9555_UNKOWN_ADDRESS; if (!io.begin(Wire, chip_address, SENSOR_SDA, SENSOR_SCL)) { while (1) { Serial.println("Failed to find XL9555 - check your wiring!"); delay(1000); } } /* * Note: * XL9555 has an internal pull-up resistor and maintains a high level when idle. * XL9535 has a floating input internally and an uncertain state when idle, requiring an external pull-up/pull-down resistor * * */ // Set PORT0 as input,mask = 0xFF = all pin input io.configPort(ExtensionIOXL9555::PORT0, 0xFF); // Set PORT1 as input,mask = 0xFF = all pin input io.configPort(ExtensionIOXL9555::PORT1, 0xFF); // Passing in user parameters static const char *gpio5_data = "GPIO 5 SET HIGH TRIGGER"; static const char *gpio7_data = "GPIO 7 SET LOW TRIGGER"; // Set GPIO5 high level to trigger callback event io.setPinEvent(5, HIGH, gpio7_event_cb, (void *)gpio5_data); // Set GPIO7 low level to trigger callback event io.setPinEvent(7, LOW, gpio7_event_cb, (void *)gpio7_data); // Remove gpio 5 callback event // io.removePinEvent(5); } void loop() { // Refresh registers when an interrupt comes if (digitalRead(SENSOR_IRQ) == LOW) { io.update(); } }