简介
这是一款基于CH423芯片的IO扩展模块,该模块可通过I2C扩展出24个数字口(8个GPIO口,支持输入、输出、中断功能,16个GPO口,支持输出功能)。模块内置电流驱动电路,连续驱动电流可达15mA,可以静态驱动24只LED或动态驱动128只LED,适用于LED数码管、点阵屏、灯阵、光立方等驱动。
特性
- 8个通用输入输出引脚
- 16个通用输出引脚
- 内置电流驱动电路,连续驱动电流可达15mA
应用场景
- LED数码管驱动
- 点阵屏驱动
- 灯阵驱动
技术规格
- 供电电压:3.3V~5V
- 静态电流:1mA
- IO连续驱动电流:15mA
- 通讯方式:I2C
- I2C地址:0x20~0x3F(该模块会占用0x20~0x3F的I2C地址,不能与该地址段的I2C设备一起使用)
- 工作温度范围:-20℃~80℃
- 产品尺寸:45*37mm
引脚说明
序号 | 丝印 | 功能描述 |
---|---|---|
1 | + | 电源正极 |
2 | - | 电源负极 |
3 | SCL | I2C时钟线 |
4 | SDA | I2C数据线 |
5 | GPIO | 输入输出引脚 |
6 | GPO | 输出引脚 |
引脚模式
引脚 | 可设置模式 | 默认 |
---|---|---|
GPO | 开漏输出、推挽输出 | 推挽输出高电平 |
GPIO | 输入、输出 | 上拉输入 |
注意:同一组内的引脚在同一时刻,只能被设置成同一种模式,不同组之间可以设置成不同的模式
Arduino使用教程
准备
- 硬件
- 1 x Arduino UNO控制板
- 1 x Gravity: CH423 I2C 24位数字IO扩展模块
- 若干 杜邦线
- 软件
- Arduino IDE, 点击下载Arduino IDE
- CH423库文件和示例程序
关于如何安装库文件,点击链接
接线图
样例代码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();
树莓派使用教程
准备
-
硬件
- 树莓派4代B型(或类似)主控板 x 1
- Gravity: CH423 I2C 24位数字IO扩展模块 x 1
- 若干杜邦线 x 1
-
软件
接线图
- 将模块与树莓派通过I2C连接
安装驱动
-
启动树莓派的I2C接口。如已开启,可跳过该步骤。
打开终端(Terminal),键入如下指令,并回车:
pi@raspberrypi:~ $ sudo raspi-config
然后用上下键选择“ 5 Interfacing Options ”, 按回车进入,选择 “ P5 I2C ”, 按回车确认“ YES ”即可。重启树莓派主控板。 -
安装Python依赖库与git,树莓派需要联网。如已安装,可跳过该步骤。
在终端中,依次键入如下指令,并回车:
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install build-essential python-dev python-smbus git
-
下载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
样例代码1-demo_blink.py
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_CH423/python/raspberry/examples
pi@raspberrypi:~/Desktop/DFRobot_CH423/python/raspberry/examples/ $ python demo_blink.py
样例代码2-demo_group.py
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_CH423/python/raspberry/examples
pi@raspberrypi:~/Desktop/DFRobot_CH423/python/raspberry/examples/ $ python demo_blink.py
样例代码3-demo_input.py
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_CH423/python/raspberry/examples
pi@raspberrypi:~/Desktop/DFRobot_CH423/python/raspberry/examples/ $ python demo_input.py
样例代码4-demo_interrupt.py
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_CH423/python/raspberry/examples
pi@raspberrypi:~/Desktop/DFRobot_CH423/python/raspberry/examples/ $ python demo_interrupt.py
样例代码5-demo_sleep.py
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_CH423/python/raspberry/examples
pi@raspberrypi:~/Desktop/DFRobot_CH423/python/raspberry/examples/ $ python demo_sleep.py
样例代码6-demo_water_lamp.py
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_CH423/python/raspberry/examples
pi@raspberrypi:~/Desktop/DFRobot_CH423/python/raspberry/examples/ $ python demo_water_lamp.py
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。