Gravity: CH423 I2C 24位数字IO扩展模块

简介

这是一款基于CH423芯片的IO扩展模块,该模块可通过I2C扩展出24个数字口(8个GPIO口,支持输入、输出、中断功能,16个GPO口,支持输出功能)。模块内置电流驱动电路,连续驱动电流可达15mA,可以静态驱动24只LED或动态驱动128只LED,适用于LED数码管、点阵屏、灯阵、光立方等驱动。

特性

应用场景

技术规格

引脚说明

序号 丝印 功能描述
1 + 电源正极
2 - 电源负极
3 SCL I2C时钟线
4 SDA I2C数据线
5 GPIO 输入输出引脚
6 GPO 输出引脚

引脚模式

引脚 可设置模式 默认
GPO 开漏输出、推挽输出 推挽输出高电平
GPIO 输入、输出 上拉输入

注意:同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式

Arduino使用教程

准备

关于如何安装库文件,点击链接

接线图

样例代码1 - blink.ino

/*!
 * @file blink.ino
 * @brief Turns an LED on for one second, then off for one second, repeatedly.
 * @note 此模块有2种方式实现blink功能:
 * @n 1. 将GPIO组引脚设置为输出模式,并把LED灯连接到GPIO组中的某一个引脚(GPIO0~GPIO7),再控制该引脚输出高低电平;
 * @n 2. 将GPO组引脚设置为推挽输出模式,并把LED灯连接到GPIO组中的某一个引脚(GPIO0~GPIO7),再控制该引脚输出高低电平;
 * @n 硬件连接:将LED引脚连接到对应的输出引脚上
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2022-03-09
 * @url https://github.com/DFRobot/DFRobot_CH423
 */
#include "DFRobot_CH423.h"

//关闭这个宏,blink功能将切换到GPO组内的GPO0引脚,否则将在GPIO组内的GPIO0引脚
#define GPIO_ENABLE

DFRobot_CH423 ch423;

void setup() {
  Serial.begin(115200);

  while(!Serial){

  }
  ch423.begin();
  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO                    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO/eGPO0_7/eGPO8_15    3种参数都表示同一个含义,设置GPO组引脚的模式,选用此参数,通用输出引脚,只能被配置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
#ifdef GPIO_ENABLE
  ch423.pinMode(ch423.eGPIO, ch423.eOUTPUT);
#else
  ch423.pinMode(ch423.eGPO, ch423.ePUSH_PULL);
#endif
}

void loop() {
#ifdef GPIO_ENABLE
  /**
   * @fn 
   * @brief 设置引脚输出高低电平。
   * @param gpioPin   GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示设置引脚GPIO0的输出值
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示设置引脚GPIO1的输出值
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示设置引脚GPIO2的输出值
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示设置引脚GPIO3的输出值
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示设置引脚GPIO4的输出值
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示设置引脚GPIO5的输出值
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示设置引脚GPIO6的输出值
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示设置引脚GPIO7的输出值
   * @n     eGPIOTotal 设置GPIO组内所有引脚的值,使用此参数时,参数level的bit0~bit7均为有效值,分别对应引脚GPIO0~GPIO7的输出值
   * @param level    输出电平
   * @n     HIGH or 1    参数level,8位数据中bit0有效,表示输出高电平
   * @n     LOW  or 0    参数level,8位数据中bit0有效,表示输出低电平
   * @n     0x00~0xFF    如果参数gpioPin为GPIOTotal时,参数level的bit0~bit7均为有效数据,分别对应GPIO0~GPIO7引脚。
   */
  ch423.digitalWrite(/* gpio= */ch423.eGPIO0, /* level= */HIGH);       // turn the LED on (HIGH is the voltage level)
  //ch423.digitalWrite(/* gpio= */ch423.eGPIOTotal, /* level= */0xFF); // 让GPIO组内所有引脚(GPIO0~GPIO7)输出高电平
  delay(1000);                                                         // wait for a second
  ch423.digitalWrite(/* gpio= */ch423.eGPIO0, /* level= */LOW);        // turn the LED off by making the voltage LOW
  //ch423.digitalWrite(/* gpio= */ch423.eGPIOTotal, /* level= */0x00); // 让GPIO组内所有引脚(GPIO0~GPIO7)输出低电平
  delay(1000);                                                         // wait for a second
#else
  /**
   * @fn digitalWrite
   * @brief 设置引脚输出高低电平或 控制低电平输出或停止(中断)。
   * @param gpoPin   eGPOPin_t 枚举变量成员
   * @n     eGPO0     通用输出引脚,GPO0,表示设置引脚GPO0的输出值
   * @n     eGPO1     通用输出引脚,GPO1,表示设置引脚GPO1的输出值
   * @n     eGPO2     通用输出引脚,GPO2,表示设置引脚GPO2的输出值
   * @n     eGPO3     通用输出引脚,GPO3,表示设置引脚GPO3的输出值
   * @n     eGPO4     通用输出引脚,GPO4,表示设置引脚GPO4的输出值
   * @n     eGPO5     通用输出引脚,GPO5,表示设置引脚GPO5的输出值
   * @n     eGPO6     通用输出引脚,GPO6,表示设置引脚GPO6的输出值
   * @n     eGPO7     通用输出引脚,GPO7,表示设置引脚GPO7的输出值
   * @n     eGPO8     通用输出引脚,GPO8,表示设置引脚GPO8的输出值
   * @n     eGPO9     通用输出引脚,GPO9,表示设置引脚GPO9的输出值
   * @n     eGPO10    通用输出引脚,GPO10,表示设置引脚GPO10的输出值
   * @n     eGPO11    通用输出引脚,GPO11,表示设置引脚GPO11的输出值
   * @n     eGPO12    通用输出引脚,GPO12,表示设置引脚GPO12的输出值
   * @n     eGPO13    通用输出引脚,GPO13,表示设置引脚GPO13的输出值
   * @n     eGPO14    通用输出引脚,GPO14,表示设置引脚GPO14的输出值
   * @n     eGPO15    通用输出引脚,GPO15,表示设置引脚GPO15的输出值
   * @n     eGPOTotal 设置GPO组0~15内的所有引脚,使用此参数时,参数8位数据level的bit0~bit7分别对应GPO0~GPO7或GPO8~GPO15引脚的输出值
   * @param level     输出电平或低电平信号输出或终止
   * @n     HIGH or 1    如果引脚组GPO被配置为推挽输出模式,则输出高电平,若配置为开漏模式,则代表输出低电平信号
   * @n     LOW  or 0    如果引脚组GPO被配置为推挽输出模式,则输出低电平,若配置为开漏模式,则代表不输出任何信号
   * @n     0x00~0xFF    如果gpoPin参数为eGPOTotal时,level的bit0~bit7都为有效数据,分别对应GPO0~GPO7或GPO8~GPO15引脚
   */
  ch423.digitalWrite(/* gpo= */ch423.eGPO0, /* level= */HIGH);       // turn the LED on (HIGH is the voltage level)
  //ch423.digitalWrite(/* gpo= */ch423.eGPOTotal, /* level= */0xFF); // 设置GPO组内所有引脚(GPO0~GPO15)输出高电平
  delay(1000);                                                       // wait for a second
  ch423.digitalWrite(/* gpio= */ch423.eGPO0, /* level= */LOW);       // turn the LED off by making the voltage LOW
  //ch423.digitalWrite(/* gpo= */ch423.eGPOTotal, /* level= */0x00); // 设置GPO组内所有引脚(GPO0~GPO15)输出低电平
  delay(1000);                           // wait for a second
#endif

}

样例代码2 - group.ino

/*!
 * @file group.ino
 * @brief 此demo主要用来演示如何一次性操作一个组的数字口。此模块具有2组数字引脚,分别为GPIO组引脚,和GPO引脚,其中GPO引脚又分为GPO0_7组引脚和GPO8_15组引脚。
 * @n GPIO组引脚: 既可做输入引脚,又可做输出引脚
 * @n GPO组引脚: 只能做输出引脚,有2种输出模式,推挽输出和开漏输出模式
 * @n 用户可以根据提供的API函数按组为单位操作引脚
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2022-03-14
 * @url https://github.com/DFRobot/DFRobot_CH423
 */
#include "DFRobot_CH423.h"

#define GROUP_GPIO_INPUT   0
#define GROUP_GPIO_OUTPUT  1
#define GROUP_GPO          2

//demo功能切换开关
#define DEMO_FUN_SWITCH    GROUP_GPIO_INPUT
//#define DEMO_FUN_SWITCH    GROUP_GPIO_OUTPUT
//#define DEMO_FUN_SWITCH    GROUP_GPO

DFRobot_CH423 ch423;

void setup() {
  Serial.begin(115200);

  while(!Serial){

  }
  ch423.begin();
  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO                    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO/eGPO0_7/eGPO8_15    3种参数都表示同一个含义,设置GPO组引脚的模式,选用此参数,通用输出引脚,只能被配置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
#if(DEMO_FUN_SWITCH == GROUP_GPIO_INPUT)
  ch423.pinMode(ch423.eGPIO, ch423.eINPUT);
#elif(DEMO_FUN_SWITCH == GROUP_GPIO_OUTPUT) 
  ch423.pinMode(ch423.eGPIO, ch423.eOUTPUT);

  //设置GPIO组引脚输出0xF0,0xF0的bit0~bit7分别对应GPIO的GPIO0~GPIO7
  DFRobot_CH423::uGroupValue_t gpio;

  gpio.GPO0  = 0; //设置引脚GPIO0输出0
  gpio.GPO1  = 0; //设置引脚GPIO1输出0
  gpio.GPO2  = 0; //设置引脚GPIO2输出0
  gpio.GPO3  = 0; //设置引脚GPIO3输出0
  gpio.GPO4  = 1; //设置引脚GPIO4输出1
  gpio.GPO5  = 1; //设置引脚GPIO5输出1
  gpio.GPO6  = 1; //设置引脚GPIO6输出1
  gpio.GPO7  = 1; //设置引脚GPIO7输出1
  //gpio.GPIO = 0xF0

  ch423.digitalWrite(ch423.eGPIO, gpio);        //设置GPIO0~GPIO3输出0, GPIO4~GPIO7输出1
  //ch423.digitalWrite(ch423.eGPIO, 0xF0);      //设置GPIO0~GPIO3输出0, GPIO4~GPIO7输出1
  //ch423.digitalWrite(ch423.eGPIOTotal, 0xF0); //设置GPIO0~GPIO3输出0, GPIO4~GPIO7输出1

  Serial.print("GPIO0  OUPUT: ");Serial.println(gpio.GPIO0);
  Serial.print("GPIO1  OUPUT: ");Serial.println(gpio.GPIO1);
  Serial.print("GPIO2  OUPUT: ");Serial.println(gpio.GPIO2);
  Serial.print("GPIO3  OUPUT: ");Serial.println(gpio.GPIO3);
  Serial.print("GPIO4  OUPUT: ");Serial.println(gpio.GPIO4);
  Serial.print("GPIO5  OUPUT: ");Serial.println(gpio.GPIO5);
  Serial.print("GPIO6  OUPUT: ");Serial.println(gpio.GPIO6);
  Serial.print("GPIO7  OUPUT: ");Serial.println(gpio.GPIO7);
#else
  ch423.pinMode(ch423.eGPO, ch423.ePUSH_PULL);

  //设置GPO组引脚输出0x55F0,0x55F0的bit0~bit15分别对应GPO的GPO0~GPIO15
  DFRobot_CH423::uGroupValue_t gpo;

  gpo.GPO0  = 0; //设置引脚GPO0输出0
  gpo.GPO1  = 0; //设置引脚GPO1输出0
  gpo.GPO2  = 0; //设置引脚GPO2输出0
  gpo.GPO3  = 0; //设置引脚GPO3输出0
  gpo.GPO4  = 1; //设置引脚GPO4输出1
  gpo.GPO5  = 1; //设置引脚GPO5输出1
  gpo.GPO6  = 1; //设置引脚GPO6输出1
  gpo.GPO7  = 1; //设置引脚GPO7输出1
  gpo.GPO8  = 1; //设置引脚GPO0输出1
  gpo.GPO9  = 0; //设置引脚GPO1输出0
  gpo.GPO10 = 1; //设置引脚GPO2输出1
  gpo.GPO11 = 0; //设置引脚GPO3输出0
  gpo.GPO12 = 1; //设置引脚GPO4输出1
  gpo.GPO13 = 0; //设置引脚GPO5输出0
  gpo.GPO14 = 1; //设置引脚GPO6输出1
  gpo.GPO15 = 0; //设置引脚GPO7输出0
  //gpo.GPO0_7  = 0xF0; 
  //gpo.GPO8_15 = 0x55; 
  //gpo.GPO = 0x55F0;  

  ch423.digitalWrite(ch423.eGPO0_7, 0xF0);          //仅设置GPO0~GPO7输出0xF0
  ch423.digitalWrite(ch423.eGPO8_15, (0x55 << 8));  //仅设置GPO8~GPO15输出0x55
  //ch423.digitalWrite(ch423.eGPO, gpo);        //设置引脚GPO15~GPO0输出0x55F0
  //ch423.digitalWrite(ch423.eGPO, 0x55F0);   //设置引脚GPO15~GPO0输出0x55F0
  Serial.print("GPO0  OUPUT: ");Serial.println(gpo.GPO0);
  Serial.print("GPO1  OUPUT: ");Serial.println(gpo.GPO1);
  Serial.print("GPO2  OUPUT: ");Serial.println(gpo.GPO2);
  Serial.print("GPO3  OUPUT: ");Serial.println(gpo.GPO3);
  Serial.print("GPO4  OUPUT: ");Serial.println(gpo.GPO4);
  Serial.print("GPO5  OUPUT: ");Serial.println(gpo.GPO5);
  Serial.print("GPO6  OUPUT: ");Serial.println(gpo.GPO6);
  Serial.print("GPO7  OUPUT: ");Serial.println(gpo.GPO7);
  Serial.print("GPO8  OUPUT: ");Serial.println(gpo.GPO8);
  Serial.print("GPO9  OUPUT: ");Serial.println(gpo.GPO9);
  Serial.print("GPO10 OUPUT: ");Serial.println(gpo.GPO10);
  Serial.print("GPO11 OUPUT: ");Serial.println(gpo.GPO11);
  Serial.print("GPO12 OUPUT: ");Serial.println(gpo.GPO12);
  Serial.print("GPO13 OUPUT: ");Serial.println(gpo.GPO13);
  Serial.print("GPO14 OUPUT: ");Serial.println(gpo.GPO14);
  Serial.print("GPO15 OUPUT: ");Serial.println(gpo.GPO15);
#endif
}

void loop() {
#if(DEMO_FUN_SWITCH == GROUP_GPIO_INPUT)
  //1s查询一次GPIO各输入引脚(GPIO0~GPIO7)的值
  //value的0~7位分别对应引脚GPIO0~GPIO7的引脚状态
  uint8_t value = ch423.digitalRead(ch423.eGPIOTotal);
  Serial.print("The group of GPIO's pins state are 0x");
  Serial.println(value, HEX);
  delay(1000);
#endif

}

样例代码3 - input.ino

/*!
 * @file input.ino
 * @brief 按下按钮后,串口打印按钮被按下
 * @note 此模块中只有GPIO组内的引脚能被设置为输入模式
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2022-03-09
 * @url https://github.com/DFRobot/DFRobot_CH423
 */
#include "DFRobot_CH423.h"

DFRobot_CH423 ch423;

void setup() {
  Serial.begin(115200);

  while(!Serial){

  }
  ch423.begin();
  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO                    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO/eGPO0_7/eGPO8_15    3种参数都表示同一个含义,设置GPO组引脚的模式,选用此参数,通用输出引脚,只能被配置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
  ch423.pinMode(ch423.eGPIO, ch423.eINPUT);
}

void loop() {
  /**
   * @fn digitalRead
   * @brief 读取GPIO组引脚的电平状态值
   * @param pin GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示读取引脚GPIO0的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示读取引脚GPIO1的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示读取引脚GPIO2的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示读取引脚GPIO3的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示读取引脚GPIO4的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示读取引脚GPIO5的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示读取引脚GPIO6的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示读取引脚GPIO7的电平状态,0表示低电平,1表示高电平
   * @n     eGPIOTotal 双向输入输出引脚,GPIO组GPIO0~GPIO7,表示读取GPIO组所有引脚的电平状态,返回值bit0~bit8分别表示GPIO0~GPIO7各引脚的电平值
   * @return 电平状态值
   */
  uint8_t value = ch423.digitalRead(/*pin = */ch423.eGPIO0);
  if(value){
      Serial.println("Button press!");
      delay(200);
  }else{
      //Serial.println("Button release!");
  }

}

样例代码4 - ioInterrupt.ino

/*!
 * @file ioInterrupt.ino
 * @brief 此demo用来演示检测GPIO引脚的上升沿、下降沿或双边沿中断
 * @note 当模块被配置为上升沿、下降沿或双边沿等中断时,MCU的外部中断应使用下降沿中断,来减少误差
 * @n 在烧录此demo后,需将模块的GPO15引脚连接到各MCU对应的外部中断引脚上
 * @n 硬件连接
 * @n --------------------------------------------------------------------
 * @n moudle |UNO   |Leonardo  |mega2560 |M0    |ESP32 |ESP8266 |microbit |
 * @n VCC    |VCC   |VCC       |VCC      |VCC   |VCC   |VCC     |VCC      |
 * @n GND    |GND   |GND       |GND      |GND   |GND   |GND     |GND      |
 * @n SCL    |SCL   |SCL       |SCL      |SCL   |SCL   |SCL     |SCL      |
 * @n SDA    |SDA   |SDA       |SDA      |SDA   |SDA   |SDA     |SDA      |
 * @n GPO15  |2/D2  |2/D2      |2/D2     |2     |2     |12      |P9       |
 * @n --------------------------------------------------------------------
 * @note GPIO0~GPIO7范围内任意引脚电平发生改变,GPO15会输出一个低电平信号,直到GPIO0~GPIO7范围内所有引脚恢复初始电平状态,GPO15才会恢复输出高电平
 * @n Leonardo不支持
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2022-03-11
 * @url https://github.com/DFRobot/DFRobot_CH423
 */
#include "DFRobot_CH423.h"

DFRobot_CH423 ch423;

#if defined(ARDUINO_BBC_MICROBIT)
#define INT_PIN     9                      //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#elif defined(ESP8266)
#define INT_PIN     12                     //将模块的GPO15引脚连接到MCU的引脚12上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#else
#define INT_PIN     2                      //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#endif

bool intFlag = false;  //INT interrupt sign

/*Interrupt service function, prototype void func(int index), index: the number of the pin that is interrupted*/
void func(int index){
  String description = ch423.pinDescription(/*pin = */(DFRobot_CH423::eGPIOPin_t)index);
  Serial.print(description);
  Serial.println(" Interruption occurs!");
}

void setup() {
  Serial.begin(115200);

  while(!Serial){

  }
  ch423.begin();
  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO                    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO/eGPO0_7/eGPO8_15    3种参数都表示同一个含义,设置GPO组引脚的模式,选用此参数,通用输出引脚,只能被配置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
  ch423.pinMode(ch423.eGPIO, ch423.eINPUT);
  /**
   * @fn attachInterrupt
   * @brief 设置GPIO引脚的外部中断模式和中断服务函数
   * @note CH423模块的GPO15引脚用来表示在中断模式下GPIO0~GPIO7是否发生中断,如果任意引脚发生了中断,GPO15将持续输出一个低电平,否则将输出高电平
   * @n 如果一个引脚发生中断,持续触发,在此期间如果其他引脚发生了中断,GPO15引脚的电平信号依然为低,不会产生任何变化
   * @param gpioPin   GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示设置引脚GPIO0的外部中断模式和中断服务函数
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示设置引脚GPIO1的外部中断模式和中断服务函数
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示设置引脚GPIO2的外部中断模式和中断服务函数
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示设置引脚GPIO3的外部中断模式和中断服务函数
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示设置引脚GPIO4的外部中断模式和中断服务函数
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示设置引脚GPIO5的外部中断模式和中断服务函数
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示设置引脚GPIO6的外部中断模式和中断服务函数
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示设置引脚GPIO7的外部中断模式和中断服务函数
   * @n     eGPIOTotal 设置GPIO组内所有引脚的值,表示将引脚GPIO0~GPIO7设置为同一中断模式和中断服务函数
   * @param mode    中断模式
   * @n     eLOW       低电平中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到低电平,GPO15引脚将输出一个低电平信号
   * @n     eHIGH      高电平中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到高电平,GPO15引脚将输出一个低电平信号
   * @n     eRISING    上升沿中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eFALLING   下降沿中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到下降沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eCHANGE    双边沿中断,GPIO引脚初始电平为高电平,每发生一次中断,初始电平切换一次,如果GPIO引脚检测到下降沿或上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @note GPIO0~GPIO7范围内任意引脚电平发生改变,GPO15会输出一个低电平信号,直到GPIO0~GPIO7范围内所有引脚恢复初始电平状态,GPO15才会恢复输出高电平
   * @param cb  指向中断服务函数
   */
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO0, /* mode= */ch423.eFALLING, /* cb= */func);
  ch423.enableInterrupt();
   /**
    * @fn attachInterrupt
    * @brief Enable the external interrupt pin of MCU. 
    * @param pin:   The external pin of MCU.
    * @n     Mega2560:  The external pin is 2、3、21、20、19、18.
    * @n     microbit:  The external pin is 0~20(P0-P20)
    * @n     ESP32, ESP8266, M0:    The external pin is all digital Pin and analog pin.
    * @param fun: Pointer to guide interrupt service function.
    * @param mode:  Interrupt trigger mode.
    * @n     FALLING: Falling edge trigger
    */
   pinMode(INT_PIN, INPUT_PULLUP);
   attachInterrupt(/*pin=*/digitalPinToInterrupt(INT_PIN),/*fun=*/notify,/*mode =*/FALLING);
   Serial.println("Set done!");
}

/*Interrupt service function*/
void notify(){
  intFlag = true;
}

void loop() {
  if(intFlag){
    intFlag = false;
    ch423.pollInterrupts();
  }
  yield();
}

样例代码5 - pollInterrupt.ino

/*!
 * @file pollInterrupt.ino
 * @brief 此demo用来演示检测GPIO引脚的低电平、高电平中断
 * @note 当模块被配置为低电平、高电平等中断时,MCU的外部中断应使用低电平中断,来减少误差
 * @n 在烧录此demo后,需将模块的GPO15引脚连接到各MCU对应的外部中断引脚上
 * @n 硬件连接
 * @n --------------------------------------------------------------------
 * @n moudle |UNO   |Leonardo  |mega2560 |M0    |ESP32 |ESP8266 |microbit |
 * @n VCC    |VCC   |VCC       |VCC      |VCC   |VCC   |VCC     |VCC      |
 * @n GND    |GND   |GND       |GND      |GND   |GND   |GND     |GND      |
 * @n SCL    |SCL   |SCL       |SCL      |SCL   |SCL   |SCL     |SCL      |
 * @n SDA    |SDA   |SDA       |SDA      |SDA   |SDA   |SDA     |SDA      |
 * @n GPO15  |2/D2  |2/D2      |2/D2     |2     |2     |12      |P9       |
 * @n --------------------------------------------------------------------
 * @note GPIO0~GPIO7范围内任意引脚电平发生改变,GPO15会输出一个低电平信号,直到GPIO0~GPIO7范围内所有引脚恢复初始电平状态,GPO15才会恢复输出高电平
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2022-03-11
 * @url https://github.com/DFRobot/DFRobot_CH423
 */
#include "DFRobot_CH423.h"

DFRobot_CH423 ch423;

#if defined(ARDUINO_BBC_MICROBIT)
#define INT_PIN     9                      //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#elif defined(ESP8266)
#define INT_PIN     12                     //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#else
#define INT_PIN     2                      //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#endif

bool intFlag = false;  //INT interrupt sign
bool intEnable = true; //MCU外部中断使能标志位

/*Interrupt service function, prototype void func(int index), index: the number of the pin that is interrupted*/
void func(int index){
  String description = ch423.pinDescription(/*pin = */(DFRobot_CH423::eGPIOPin_t)index);
  Serial.print(description);
  Serial.println(" Interruption occurs!");
}

void setup() {
  Serial.begin(115200);

  while(!Serial){

  }
  ch423.begin();
  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO     通用输出引脚,GPO0~GPO15,此组引脚可被设置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,设置为其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
  ch423.pinMode(ch423.eGPIO, ch423.eINPUT);
  /**
   * @fn attachInterrupt
   * @brief 设置GPIO引脚的外部中断模式和中断服务函数
   * @note CH423模块的GPO15引脚用来表示在中断模式下GPIO0~GPIO7是否发生中断,如果任意引脚发生了中断,GPO15将持续输出一个低电平,否则将输出高电平
   * @n 如果一个引脚发生中断,持续触发,在此期间如果其他引脚发生了中断,GPO15引脚的电平信号依然为低,不会产生任何变化
   * @param gpioPin   GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示设置引脚GPIO0的外部中断模式和中断服务函数
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示设置引脚GPIO1的外部中断模式和中断服务函数
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示设置引脚GPIO2的外部中断模式和中断服务函数
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示设置引脚GPIO3的外部中断模式和中断服务函数
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示设置引脚GPIO4的外部中断模式和中断服务函数
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示设置引脚GPIO5的外部中断模式和中断服务函数
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示设置引脚GPIO6的外部中断模式和中断服务函数
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示设置引脚GPIO7的外部中断模式和中断服务函数
   * @n     eGPIOTotal 设置GPIO组内所有引脚的值,表示将引脚GPIO0~GPIO7设置为同一中断模式和中断服务函数
   * @param mode    中断模式
   * @n     eLOW       低电平中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到低电平,GPO15引脚将输出一个低电平信号
   * @n     eHIGH      高电平中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到高电平,GPO15引脚将输出一个低电平信号
   * @n     eRISING    上升沿中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eFALLING   下降沿中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到下降沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eCHANGE    双边沿中断,GPIO引脚初始电平为高电平,每发生一次中断,初始电平切换一次,如果GPIO引脚检测到下降沿或上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @note GPIO0~GPIO7范围内任意引脚电平发生改变,GPO15会输出一个低电平信号,直到GPIO0~GPIO7范围内所有引脚恢复初始电平状态,GPO15才会恢复输出高电平
   * @param cb  指向中断服务函数
   */
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO0, /* mode= */ch423.eHIGH, /* cb= */func);
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO1, /* mode= */ch423.eLOW, /* cb= */func);
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO2, /* mode= */ch423.eLOW, /* cb= */func);
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO3, /* mode= */ch423.eLOW, /* cb= */func);
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO4, /* mode= */ch423.eLOW, /* cb= */func);
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO5, /* mode= */ch423.eLOW, /* cb= */func);
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO6, /* mode= */ch423.eLOW, /* cb= */func);
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIO7, /* mode= */ch423.eLOW, /* cb= */func);
  ch423.enableInterrupt();
  /**
    * @brief Enable the external interrupt pin of MCU. 
    * @param pin:   The external pin of MCU.
    * @n     Mega2560:  The external pin is 2、3、21、20、19、18.
    * @n     microbit:  The external pin is 0~20(P0-P20)
    * @n     ESP32, ESP8266, M0:    The external pin is all digital Pin and analog pin.
    * @param fun: Pointer to guide interrupt service function.
    * @param mode:  Interrupt trigger mode.
    * @n     LOW:     Low level trigger.
    * @n     HIGH:    HIGH level trigger
    * @n     RISING:  Rising edge trigger
    * @n     FALLING: Falling edge trigger
    * @n     CHANGE:  Double edge transition trigger
    */
   pinMode(INT_PIN, INPUT_PULLUP);
   attachInterrupt(/*pin=*/digitalPinToInterrupt(INT_PIN),/*fun=*/notify,/*mode =*/LOW);
   Serial.println("Set done!");
}

/*Interrupt service function*/
void notify(){
  intFlag = true;
}

void loop() {
  if(!intEnable){
    intEnable = true;
    attachInterrupt(/*pin=*/digitalPinToInterrupt(INT_PIN),/*fun=*/notify,/*mode =*/LOW);
  } 
  if(intFlag){
    intFlag = false;
    detachInterrupt(digitalPinToInterrupt(INT_PIN));
    intEnable = false;
    ch423.pollInterrupts();
  }
  delay(100);
  yield();
}

样例代码6 - sleep.ino

/*!
 * @file sleep.ino
 * @brief 配置模块进入睡眠模式,一段时间后,再唤醒,模块进入睡眠模式后有2种方式唤醒,如下所述:
 * @n  1. 模块处于中断模式,当GPIO引脚发生外部中断时唤醒;
 * @n  2. 和模块进行I2C通信,此方式,你可以调用引脚相关读取、设置之类的函数。
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2022-03-09
 * @url https://github.com/DFRobot/DFRobot_CH423
 */
#include "DFRobot_CH423.h"

DFRobot_CH423 ch423;

#if defined(ARDUINO_BBC_MICROBIT)
#define INT_PIN     9                      //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#elif defined(ESP8266)
#define INT_PIN     12                     //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#else
#define INT_PIN     2                      //将模块的GPO15引脚连接到MCU的引脚2上,个别MCU需等程序下载完成后,才能连接GPO15和MCU的外部中断引脚
#endif

bool intFlag = false;  //INT interrupt sign
bool wakeupFlag = false; //唤醒标志位

void setup() {
  Serial.begin(115200);

  while(!Serial){

  }
  ch423.begin();
  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO                    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO/eGPO0_7/eGPO8_15    3种参数都表示同一个含义,设置GPO组引脚的模式,选用此参数,通用输出引脚,只能被配置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
  ch423.pinMode(ch423.eGPIO, ch423.eINPUT);
  /**
   * @fn attachInterrupt
   * @brief 设置GPIO引脚的外部中断模式和中断服务函数
   * @note CH423模块的GPO15引脚用来表示在中断模式下GPIO0~GPIO7是否发生中断,如果任意引脚发生了中断,GPO15将持续输出一个低电平,否则将输出高电平
   * @n 如果一个引脚发生中断,持续触发,在此期间如果其他引脚发生了中断,GPO15引脚的电平信号依然为低,不会产生任何变化
   * @param gpioPin   GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示设置引脚GPIO0的外部中断模式和中断服务函数
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示设置引脚GPIO1的外部中断模式和中断服务函数
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示设置引脚GPIO2的外部中断模式和中断服务函数
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示设置引脚GPIO3的外部中断模式和中断服务函数
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示设置引脚GPIO4的外部中断模式和中断服务函数
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示设置引脚GPIO5的外部中断模式和中断服务函数
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示设置引脚GPIO6的外部中断模式和中断服务函数
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示设置引脚GPIO7的外部中断模式和中断服务函数
   * @n     eGPIOTotal 设置GPIO组内所有引脚的值,表示将引脚GPIO0~GPIO7设置为同一中断模式和中断服务函数
   * @param mode    中断模式
   * @n     eLOW       低电平中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到低电平,GPO15引脚将输出一个低电平信号
   * @n     eHIGH      高电平中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到高电平,GPO15引脚将输出一个低电平信号
   * @n     eRISING    上升沿中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eFALLING   下降沿中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到下降沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eCHANGE    双边沿中断,GPIO引脚初始电平为高电平,每发生一次中断,初始电平切换一次,如果GPIO引脚检测到下降沿或上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @note GPIO0~GPIO7范围内任意引脚电平发生改变,GPO15会输出一个低电平信号,直到GPIO0~GPIO7范围内所有引脚恢复初始电平状态,GPO15才会恢复输出高电平
   * @param cb  指向中断服务函数
   */
  ch423.attachInterrupt(/* gpioPin= */ch423.eGPIOTotal, /* mode= */ch423.eFALLING, /* cb= */NULL);
  ch423.enableInterrupt();
   /**
    * @fn attachInterrupt
    * @brief Enable the external interrupt pin of MCU. 
    * @param pin:   The external pin of MCU.
    * @n     Mega2560:  The external pin is 2、3、21、20、19、18.
    * @n     microbit:  The external pin is 0~20(P0-P20)
    * @n     ESP32, ESP8266, M0:    The external pin is all digital Pin and analog pin.
    * @param fun: Pointer to guide interrupt service function.
    * @param mode:  Interrupt trigger mode.
    * @n     FALLING: Falling edge trigger
    */
   pinMode(INT_PIN, INPUT_PULLUP);
   attachInterrupt(/*pin=*/digitalPinToInterrupt(INT_PIN),/*fun=*/notify,/*mode =*/FALLING);
   ch423.sleep();
   Serial.println("Sleeping...");
}

/*Interrupt service function*/
void notify(){
  intFlag = true;
}

void loop() {
  if(intFlag){
    intFlag = false;
    if(!wakeupFlag) 
    {
      Serial.println("Waking up...");
    }
    wakeupFlag = true;
  }

  if(wakeupFlag && digitalRead(INT_PIN)){
    wakeupFlag = false;
    ch423.sleep(); //进入睡眠模式
    Serial.println("\n\nSleeping...");
  }
}

样例代码7 - waterLamp.ino

/*!
 * @file waterLamp.ino
 * @brief 此demo用来演示流水灯的效果
 * @note 需要将8颗LED灯连接到GPIO组引脚或GPO0~7组引脚,或GPO8~15组引脚上,你可以通过切换GROUP_FLAG来实现连接到不同组IO口上的效果
 *
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author [Arya](xue.peng@dfrobot.com)
 * @version  V1.0
 * @date  2022-03-11
 * @url https://github.com/DFRobot/DFRobot_CH423
 */
#include "DFRobot_CH423.h"

#define GROUP_GPIO    0
#define GROUP_GPO0_7  1
#define GROUP_GPO8_15 2

//通过控制宏 GROUP_FLAG,来实现led灯连接到模块的那组引脚
#define GROUP_FLAG  GROUP_GPIO
//#define GROUP_FLAG  GROUP_GPO0_7
//#define GROUP_FLAG  GROUP_GPO8_15

DFRobot_CH423 ch423;

void setup() {
  Serial.begin(115200);

  while(!Serial){

  }
  ch423.begin();
  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO                    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO/eGPO0_7/eGPO8_15    3种参数都表示同一个含义,设置GPO组引脚的模式,选用此参数,通用输出引脚,只能被配置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
#if  (GROUP_FLAG == GROUP_GPIO)
  ch423.pinMode(ch423.eGPIO, ch423.eOUTPUT);
#else
  ch423.pinMode(ch423.eGPO, ch423.ePUSH_PULL);
#endif
}

void loop() {
#if  (GROUP_FLAG == GROUP_GPIO)

  DFRobot_CH423::eGPIOPin_t gpioBuf[]= {ch423.eGPIO0, ch423.eGPIO1, ch423.eGPIO2, ch423.eGPIO3, ch423.eGPIO4, ch423.eGPIO5, ch423.eGPIO6, ch423.eGPIO7};
  int on = 0, off;
  ch423.digitalWrite(gpioBuf[on], HIGH);
  for(on = 1, off = 0; on < sizeof(gpioBuf)/sizeof(DFRobot_CH423::eGPIOPin_t); on++, off++){
    ch423.digitalWrite(gpioBuf[on], HIGH);
    ch423.digitalWrite(gpioBuf[off], LOW);
    delay(200);
  }
  ch423.digitalWrite(gpioBuf[off], LOW);

#elif (GROUP_FLAG == GROUP_GPO0_7)
  DFRobot_CH423::eGPOPin_t gpoBuf[]= {ch423.eGPO0, ch423.eGPO1, ch423.eGPO2, ch423.eGPO3, ch423.eGPO4, ch423.eGPO5, ch423.eGPO6, ch423.eGPO7};
  int on = 0, off;
  ch423.digitalWrite(gpoBuf[on], HIGH);
  for(on = 1, off = 0; on < sizeof(gpoBuf)/sizeof(DFRobot_CH423::eGPOPin_t); on++, off++){
    ch423.digitalWrite(gpoBuf[on], HIGH);
    ch423.digitalWrite(gpoBuf[off], LOW);
    delay(200);
  }
  ch423.digitalWrite(gpoBuf[off], LOW);
#else
  DFRobot_CH423::eGPOPin_t gpoBuf[]= {ch423.eGPO8, ch423.eGPO9, ch423.eGPO10, ch423.eGPO11, ch423.eGPO12, ch423.eGPO13, ch423.eGPO14, ch423.eGPO15};
  int on = 0, off;
  ch423.digitalWrite(gpoBuf[on], HIGH);
  for(on = 1, off = 0; on < sizeof(gpoBuf)/sizeof(DFRobot_CH423::eGPOPin_t); on++, off++){
    ch423.digitalWrite(gpoBuf[on], HIGH);
    ch423.digitalWrite(gpoBuf[off], LOW);
    delay(200);
  }
  ch423.digitalWrite(gpoBuf[off], LOW);
#endif
  delay(200);
}

主要API接口函数列表

  typedef enum{
    eGPO0,   /**< 通用输出引脚,GPO0 */
    eGPO1,   /**< 通用输出引脚,GPO1 */
    eGPO2,   /**< 通用输出引脚,GPO2 */
    eGPO3,   /**< 通用输出引脚,GPO3 */
    eGPO4,   /**< 通用输出引脚,GPO4 */
    eGPO5,   /**< 通用输出引脚,GPO5 */
    eGPO6,   /**< 通用输出引脚,GPO6 */
    eGPO7,   /**< 通用输出引脚,GPO7 */
    eGPO8,   /**< 通用输出引脚,GPO8 */
    eGPO9,   /**< 通用输出引脚,GPO9 */
    eGPO10,  /**< 通用输出引脚,GPO10*/
    eGPO11,  /**< 通用输出引脚,GPO11*/
    eGPO12,  /**< 通用输出引脚,GPO12*/
    eGPO13,  /**< 通用输出引脚,GPO13*/
    eGPO14,  /**< 通用输出引脚,GPO14*/
    eGPO15,  /**< 通用输出引脚,GPO15*/
    eGPOTotal/**< 通用输出引脚总数   */
  }eGPOPin_t;

  typedef enum{
    eGPIO0,    /**< 双向输入输出引脚,GPIO0*/
    eGPIO1,    /**< 双向输入输出引脚,GPIO1*/
    eGPIO2,    /**< 双向输入输出引脚,GPIO2*/
    eGPIO3,    /**< 双向输入输出引脚,GPIO3*/
    eGPIO4,    /**< 双向输入输出引脚,GPIO4*/
    eGPIO5,    /**< 双向输入输出引脚,GPIO5*/
    eGPIO6,    /**< 双向输入输出引脚,GPIO6*/
    eGPIO7,    /**< 双向输入输出引脚,GPIO7*/
    eGPIOTotal /**< 双向输入输出引脚总数    */
  }eGPIOPin_t;

  typedef enum{
    eGPIO,   /**< 双向输入输出引脚,GPIO0~GPIO7  */
    eGPO,    /**< 通用输出引脚,GPO0~GPO15       */
    eGPO0_7, /**< 通用输出引脚,GPO0~GPO7        */
    eGPO8_15 /**< 通用输出引脚,GPO8~GPO15       */
  }ePinGroup_t;

  typedef enum{
    eINPUT,       /**<GPIO引脚输入模式,浮空时为高电平*/
    eOUTPUT,      /**<GPIO引脚输出模式, 可输出高低电平*/
    eOPEN_DRAIN,  /**<GPO引脚开漏输出模式, 此模式只能用于eGPO0_7和eGPO8_15组数字口, 在此模式下,GPO引脚只能输出低电平或不输出*/
    ePUSH_PULL    /**<GPO引脚推挽输出模式, 此模式只能用于eGPO0_7和eGPO8_15组数字口, 在此模式下,GPO引脚可输出高电平或低电平*/
  }eMode_t;

  typedef enum{
    eLOW,            /**< configure pin interrupt, low level interrupt */
    eHIGH,           /**< configure pin interrupt, high level interrupt */
    eRISING,         /**< configure pin interrupt, rising edge interrupt */
    eFALLING,        /**< configure pin interrupt, falling edge interrupt */
    eCHANGE          /**< configure pin interrupt, double edge interrupt*/
  }eInterruptMode_t;

  /**
   * @fn pinMode
   * @brief 设置引脚组集合的模式,此模块包含2组引脚,分别为GPIO(GPIO0~GPIO7)和GPO(GPO0~GPO15)。
   * @note 此模块,按组设置模式,同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
   * @param group   引脚组参数,ePinGroup_t枚举变量成员
   * @n     eGPIO                    双向输入输出引脚,GPIO0~GPIO7,此组引脚可被设置为输入(eINPUT)或输出(eOUTPUT)模式,设置为其他模式无效
   * @n     eGPO/eGPO0_7/eGPO8_15    3种参数都表示同一个含义,设置GPO组引脚的模式,选用此参数,通用输出引脚,只能被配置为开漏(eOPEN_DRAIN)或推挽(ePUSH_PULL)输出模式,其他模式无效
   * @param mode    组引脚模式参数,为eMode_t枚举变量的成员
   * @n     eINPUT       GPIO引脚输入模式,浮空时为高电平,此模式只能用于eGPIO组数字口
   * @n     eOUTPUT      GPIO引脚输出模式, 可输出高低电平,此模式只能用于eGPIO组数字口
   * @n     eOPEN_DRAIN  GPO引脚开漏输出模式, 在此模式下,GPO引脚只能输出低电平或不输出,此模式只能用于eGPO组数字口
   * @n     ePUSH_PULL   GPO引脚推挽输出模式, 在此模式下,GPO引脚可输出高电平或低电平, 此模式只能用于eGPO组数字口
   */
  void pinMode(ePinGroup_t group, eMode_t mode);
  void pinMode(int group, int mode);

  /**
   * @fn 
   * @brief 设置引脚输出高低电平。
   * @param gpioPin   GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示设置引脚GPIO0的输出值
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示设置引脚GPIO1的输出值
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示设置引脚GPIO2的输出值
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示设置引脚GPIO3的输出值
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示设置引脚GPIO4的输出值
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示设置引脚GPIO5的输出值
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示设置引脚GPIO6的输出值
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示设置引脚GPIO7的输出值
   * @n     eGPIOTotal 设置GPIO组内所有引脚的值,使用此参数时,参数level的bit0~bit7均为有效值,分别对应引脚GPIO0~GPIO7的输出值
   * @param level    输出电平
   * @n     HIGH or 1    参数level,8位数据中bit0有效,表示输出高电平
   * @n     LOW  or 0    参数level,8位数据中bit0有效,表示输出低电平
   * @n     0x00~0xFF    如果参数gpioPin为GPIOTotal时,参数level的bit0~bit7均为有效数据,分别对应GPIO0~GPIO7引脚。
   */
  void  digitalWrite(eGPIOPin_t gpioPin, uint8_t level);

  /**
   * @fn digitalWrite
   * @brief 设置引脚输出高低电平或 控制低电平输出或停止(中断)。
   * @param gpoPin   eGPOPin_t 枚举变量成员
   * @n     eGPO0     通用输出引脚,GPO0,表示设置引脚GPO0的输出值
   * @n     eGPO1     通用输出引脚,GPO1,表示设置引脚GPO1的输出值
   * @n     eGPO2     通用输出引脚,GPO2,表示设置引脚GPO2的输出值
   * @n     eGPO3     通用输出引脚,GPO3,表示设置引脚GPO3的输出值
   * @n     eGPO4     通用输出引脚,GPO4,表示设置引脚GPO4的输出值
   * @n     eGPO5     通用输出引脚,GPO5,表示设置引脚GPO5的输出值
   * @n     eGPO6     通用输出引脚,GPO6,表示设置引脚GPO6的输出值
   * @n     eGPO7     通用输出引脚,GPO7,表示设置引脚GPO7的输出值
   * @n     eGPO8     通用输出引脚,GPO8,表示设置引脚GPO8的输出值
   * @n     eGPO9     通用输出引脚,GPO9,表示设置引脚GPO9的输出值
   * @n     eGPO10    通用输出引脚,GPO10,表示设置引脚GPO10的输出值
   * @n     eGPO11    通用输出引脚,GPO11,表示设置引脚GPO11的输出值
   * @n     eGPO12    通用输出引脚,GPO12,表示设置引脚GPO12的输出值
   * @n     eGPO13    通用输出引脚,GPO13,表示设置引脚GPO13的输出值
   * @n     eGPO14    通用输出引脚,GPO14,表示设置引脚GPO14的输出值
   * @n     eGPO15    通用输出引脚,GPO15,表示设置引脚GPO15的输出值
   * @n     eGPOTotal 设置GPO组0~15内的所有引脚,使用此参数时,参数8位数据level的bit0~bit7分别对应GPO0~GPO7或GPO8~GPO15引脚的输出值
   * @param level     输出电平或低电平信号输出或终止
   * @n     HIGH or 1    如果引脚组GPO被配置为推挽输出模式,则输出高电平,若配置为开漏模式,则代表输出低电平信号
   * @n     LOW  or 0    如果引脚组GPO被配置为推挽输出模式,则输出低电平,若配置为开漏模式,则代表不输出任何信号
   * @n     0x00~0xFF    如果gpoPin参数为eGPOTotal时,level的bit0~bit7都为有效数据,分别对应GPO0~GPO7或GPO8~GPO15引脚
   */
  void  digitalWrite(eGPOPin_t gpoPin, uint8_t level);
  /**
   * @fn digitalWrite
   * @brief 按组为单位,设置CH423各组IO引脚的输出值
   * @param group   组引脚,ePinGroup_t枚举变量成员
   * @n     eGPIO    GPIO组引脚0~7,设置此值时,参数level低8位有效, bit0~bit7分别对应GPIO0~GPIO7引脚的输出值,表示设置GPIO组0~7引脚的输出值。
   * @n     eGPO     GPO组引脚0~15,设置此值时,参数level 16位居有效, bit0~bit15分别对应GPO0~GPIO15引脚的输出值,表示设置GPO组0~15引脚的输出值。
   * @n     eGPO0_7  GPO组引脚0~7,设置此值时,参数level低8位有效, bit0~bit7分别对应GPO0~GPO7引脚的输出值,表示设置GPO组0~7引脚的输出值。
   * @n     eGPO8_15 GPO组引脚8~15,设置此值时,参数level高8位有效, bit8~bit15分别对应GPO8~GPO15引脚的输出值,表示设置GPO组8~15引脚的输出值。
   * @param level    16位数据或uGroupValue_t共用体值,配合group参数,表示某组引脚的值,bit0~bit15分别对应GPIO0~GPIO7,高八位无效或GPO0~GPO15
   * @n     0x0000~0xFFFF  16位数据,bit0~bit15按参数group的值分别代表不同的含义
   * @note uGroupValue_t共用体,用户可以操作这个来配置各引脚的值
   */
  void  digitalWrite(ePinGroup_t group, uGroupValue_t level);
  void  digitalWrite(ePinGroup_t group, uint16_t level);

  /**
   * @fn digitalRead
   * @brief 读取GPIO组引脚的电平状态值
   * @param pin GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示读取引脚GPIO0的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示读取引脚GPIO1的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示读取引脚GPIO2的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示读取引脚GPIO3的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示读取引脚GPIO4的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示读取引脚GPIO5的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示读取引脚GPIO6的电平状态,0表示低电平,1表示高电平
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示读取引脚GPIO7的电平状态,0表示低电平,1表示高电平
   * @n     eGPIOTotal 双向输入输出引脚,GPIO组GPIO0~GPIO7,表示读取GPIO组所有引脚的电平状态,返回值bit0~bit8分别表示GPIO0~GPIO7各引脚的电平值
   * @return 电平状态值
   */
  uint8_t digitalRead(eGPIOPin_t pin);

  /**
   * @fn attachInterrupt
   * @brief 设置GPIO引脚的外部中断模式和中断服务函数
   * @note CH423模块的GPO15引脚用来表示在中断模式下GPIO0~GPIO7是否发生中断,如果任意引脚发生了中断,GPO15将持续输出一个低电平,否则将输出高电平
   * @n 如果一个引脚发生中断,持续触发,在此期间如果其他引脚发生了中断,GPO15引脚的电平信号依然为低,不会产生任何变化
   * @param gpioPin   GPIO组内引脚,eGPIOPin_t 枚举变量成员
   * @n     eGPIO0     双向输入输出引脚,GPIO0,表示设置引脚GPIO0的外部中断模式和中断服务函数
   * @n     eGPIO1     双向输入输出引脚,GPIO1,表示设置引脚GPIO1的外部中断模式和中断服务函数
   * @n     eGPIO2     双向输入输出引脚,GPIO2,表示设置引脚GPIO2的外部中断模式和中断服务函数
   * @n     eGPIO3     双向输入输出引脚,GPIO3,表示设置引脚GPIO3的外部中断模式和中断服务函数
   * @n     eGPIO4     双向输入输出引脚,GPIO4,表示设置引脚GPIO4的外部中断模式和中断服务函数
   * @n     eGPIO5     双向输入输出引脚,GPIO5,表示设置引脚GPIO5的外部中断模式和中断服务函数
   * @n     eGPIO6     双向输入输出引脚,GPIO6,表示设置引脚GPIO6的外部中断模式和中断服务函数
   * @n     eGPIO7     双向输入输出引脚,GPIO7,表示设置引脚GPIO7的外部中断模式和中断服务函数
   * @n     eGPIOTotal 设置GPIO组内所有引脚的值,表示将引脚GPIO0~GPIO7设置为同一中断模式和中断服务函数
   * @param mode    中断模式
   * @n     eLOW       低电平中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到低电平,GPO15引脚将输出一个低电平信号
   * @n     eHIGH      高电平中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到高电平,GPO15引脚将输出一个低电平信号
   * @n     eRISING    上升沿中断,GPIO引脚初始电平为低电平,如果GPIO引脚检测到上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eFALLING   下降沿中断,GPIO引脚初始电平为高电平,如果GPIO引脚检测到下降沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @n     eCHANGE    双边沿中断,GPIO引脚初始电平为高电平,每发生一次中断,初始电平切换一次,如果GPIO引脚检测到下降沿或上升沿,GPO15引脚将输出一个由高到低的电平信号(下降沿)
   * @note GPIO0~GPIO7范围内任意引脚电平发生改变,GPO15会输出一个低电平信号,直到GPIO0~GPIO7范围内所有引脚恢复初始电平状态,GPO15才会恢复输出高电平
   * @param cb  指向中断服务函数
   */
  void attachInterrupt(eGPIOPin_t gpioPin, eInterruptMode_t mode, CH423_INT_CB cb);  

  /**
   * @fn enableInterrupt
   * @brief 使能GPIO的外部中断
   */
  void enableInterrupt();

  /**
   * @fn disableInterrupt
   * @brief 关闭GPIO的外部中断
   */
  void disableInterrupt();

  /**
   * @fn pollInterrupts
   * @brief 轮询GPIO中断事件
   */
  void pollInterrupts();

  /**
   * @fn pollInterrupts
   * @brief 进入睡眠模式
   * @note 进入此模式后,可通过2种方式唤醒
   * @n 1. GPIO引脚产生了外部中断
   * @n 2. 执行了引脚操作
   */
  void sleep();

树莓派使用教程

准备

接线图

安装驱动

  1. 启动树莓派的I2C接口。如已开启,可跳过该步骤。 打开终端(Terminal),键入如下指令,并回车:
    pi@raspberrypi:~ $ sudo raspi-config
    然后用上下键选择“ 5 Interfacing Options ”, 按回车进入,选择 “ P5 I2C ”, 按回车确认“ YES ”即可。重启树莓派主控板。

  2. 安装Python依赖库与git,树莓派需要联网。如已安装,可跳过该步骤。 在终端中,依次键入如下指令,并回车: pi@raspberrypi:~ $ sudo apt-get update
    pi@raspberrypi:~ $ sudo apt-get install build-essential python-dev python-smbus git

  3. 下载DFRobot_CH423驱动库。在终端中,依次键入如下指令,并回车: pi@raspberrypi:~ $ cd Desktop/
    `pi@raspberrypi:~/Desktop $ git clone https://github.com/DFRobot/DFRobot_CH423

样例代码

样例代码1-demo_blink.py

样例代码2-demo_group.py

样例代码3-demo_input.py

样例代码4-demo_interrupt.py

样例代码5-demo_sleep.py

样例代码6-demo_water_lamp.py

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png DFRobot商城购买链接