数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 148|回复: 10

[Arduino] AI编程玩一元钱的ESP32-C2模块【4】——I2C通讯

[复制链接]
发表于 6 小时前 | 显示全部楼层 |阅读模式
此前的一贴:AI编程玩一元钱的ESP32-C2模块【3】——前两篇综合https://www.mydigit.cn/forum.php?mod=viewthread&tid=533626&fromuid=1505079
的阅读量为0,应该是帖子的水平太“菜”技术含量太“水”,也可能是没有同道新手感兴趣吧。
扔掉醋壶抖擞精神继续水贴。
今天玩通了这个小模块的I2C通讯,说起它的I2C接口我曾经对模块的器件ESP8684数据手册翻看了半天,但限于理解能力并没有找到相关硬件I2C通道、引脚的提示,咨询百度AI后得知它的I2C引脚是可以任意配置的,如此一来我就不知道我用到的是硬件I2C还是软件模拟了,但无论怎样我用Wire.h库实现了I2C通讯这就够了我也不愿意过深的研究了。
为了测试I2C通讯就要找一个I2C的器件,起初想找一个多年前玩过的带有经典I2C接口芯片AT24C02的模块但没有找到,却找到一个I2C接口的PCF8756驱动5位半数码的LCD段码屏。
于是在网页版的Deepseek提问:“给出ESP32C2点亮PCF8576驱动5位半8字段码屏的的arduino代码”,很快就得到了代码,编译烧录后段码屏毫无反应,看来这次AI编程翻车了,毕竟屏幕内部接线不同涉及到的控制字也不同程序自然就无法通用了。
于是重新百度搜集这个段码屏的资料,结果竟然搜到了十几年前我自己发的点亮这个屏的帖子,难得的是帖子里还有我自己拆屏描绘的接线原理图,只是那段根据别人的代码改编的程序现在来看真真的无法入眼也懒得测试了,接下来根据PCF8576的数据手册重新写了代码再次点亮了这块段码屏。
用于STC8H单片机硬件I2C控制的代码如下:
  1. //程序编写于2025/07/21,原创:wannenggong
  2. //程序用于时钟显示,显示画面为12-47
  3. //使用STC8H8K64U单片机的硬件I2C驱动PCF8576-5位半8字LCD段码屏
  4. //屏幕左侧的两个8字位原本显示:汉字“价格”、“折扣”、数字“1”,程序控制其没有显示、为空白状态
  5. //使用I2C-4通道,SCL=P3.2;SDA=P3.3;
  6. //烧录代码时设定系统时钟24MHz
  7. #include <STC8H.H>
  8. #include "I2C.h"

  9. #define PCF_BUS_ADDR 0x72                //PCF8756静态显示模式的I2C总线地址
  10. #define PCF_DISP_MODE 0x49        //PCF8756显示模式控制字
  11. #define PCF_RAM_START 0x00        //PCF8756内部显示数据存储单元RAM的起始地址
  12. #define PCF_SAX_ADDR 0x60                //多PCF8756器件联机时的器件地址
  13. #define DIS_FLKR_SET 0x70                //不闪烁显示命令字@最后一个命令(C=0)
  14. #define BT7_C 0x80                                        //控制指令8位数据的最高位C
  15. uchar Digit[] = {0xd7, 0x06, 0xe3, 0xa7, 0x36, 0xb5, 0xf5, 0x17, 0xf7, 0xb7, 0x20, 0x00}; //(10)0x20点亮g段,0x00是清除显示码
  16. uchar wei = 5; //LCD数码显示位数设定
  17. u8 cnt[5] = {1, 2, 10, 4, 7}; //用于时间显示数据缓存、初始显示时间为2-47

  18. //----发送显示数据函数-------------------------------
  19. void Display_Data()        //显示时间数据
  20. {
  21.   uchar i;
  22.   i2c_start();
  23.   write_dat(PCF_BUS_ADDR);                                        //发送总线地址不执行BT7位规则
  24.   Receive_ACK();
  25.   write_dat(PCF_DISP_MODE | BT7_C); //静态显示模式,发送非最后一条指令时BT7位需要置1(C=1)
  26.   Receive_ACK();
  27.   write_dat(PCF_RAM_START | BT7_C);
  28.   Receive_ACK();
  29.   write_dat(PCF_SAX_ADDR | BT7_C);
  30.   Receive_ACK();
  31.   write_dat(DIS_FLKR_SET);                                        //发送最后一条指令时BT7位需要置0(C=0),不进行|BT7_C操作
  32.   Receive_ACK();

  33.   for(i = 0; i < wei; i++)                                        // 发送数据
  34.   {
  35.     write_dat(Digit[cnt[i]]);
  36.     Receive_ACK();
  37.   }

  38.   i2c_stop();
  39. }
  40. //----主函数--------------------------------------
  41. void main(void)
  42. {
  43.   EAXSFR();
  44.   GPIO_set();
  45.   P3PU = 0x0c;//P3.2、P3.3配置上拉电阻
  46.   I2C_init();

  47.   while(1)
  48.   {
  49.     Display_Data();

  50.   }
  51. }
复制代码


有了C51程序,再次打开deepseek提问:将下述C51代码转换成ESP32C2代码
得到了arduino代码,修改了器件总线地址后测试成功,ESP32C2的代码如下:
  1. /**
  2. * ESP32-C2(即ESP8684)支持硬件I2C接口,
  3. * 但不同于传统固定引脚设计,其I2C引脚可通过软件指定任意GPIO。
  4. * 这意味着用户可自由选择空闲的GPIO作为SDA和SCL线,无需局限于特定物理引脚
  5. * 硬件连接:
  6. * 任意选择两个未占用的GPIO(如GPIO7和GPIO8),分别连接至外部设备的SDA与SCL线,并确保共地(GND)连接。
  7. * 在Arduino IDE中,通过Wire.begin(SDA_PIN, SCL_PIN)初始化自定义引脚
  8. **/
  9. #include <Wire.h>

  10. const int sdaPin = 7; // 自定义SDA引脚
  11. const int sclPin = 8; // 自定义SCL引脚

  12. #define PCF_BUS_ADDR 0x39    // PCF8576静态显示模式的I2C总线地址,8位地址为0x72,arduino中使用7位地址0x39
  13. #define PCF_DISP_MODE 0x49   // PCF8576显示模式控制字
  14. #define PCF_RAM_START 0x00   // PCF8576内部显示数据存储单元RAM的起始地址
  15. #define PCF_SAX_ADDR 0x60    // 多PCF8576器件联机时的器件地址
  16. #define DIS_FLKR_SET 0x70    // 不闪烁显示命令字(C=0)
  17. #define BT7_C 0x80           // 控制指令8位数据的最高位C

  18. // 数码管段码表 (共阴数码管)
  19. uint8_t Digit[] = {0xd7, 0x06, 0xe3, 0xa7, 0x36, 0xb5, 0xf5, 0x17, 0xf7, 0xb7, 0x20, 0x00};
  20. // 0-9数字的段码,10号(0x20)点亮g段,11号(0x00)是清除显示码

  21. uint8_t wei = 5;             // 数码管显示位数设定
  22. uint8_t cnt[5] = {1, 2, 10, 4, 7}; // 显示数据缓存,初始显示"12 47"(10表示中间横杠)
  23. //----------------------------------------------------------
  24. void Display_Data()
  25. {
  26.   Wire.beginTransmission(PCF_BUS_ADDR);//arduino发送器件的总线地址时有addr<<1将7位地址变成8位地址的操作
  27.   
  28.   // 发送控制命令
  29.   Wire.write(PCF_DISP_MODE | BT7_C);  // 设置显示模式
  30.   Wire.write(PCF_RAM_START | BT7_C);  // 设置RAM起始地址
  31.   Wire.write(PCF_SAX_ADDR | BT7_C);   // 设置从机地址
  32.   Wire.write(DIS_FLKR_SET);           // 设置不闪烁模式(C=0)
  33.   
  34.   // 发送显示数据
  35.   for(uint8_t i = 0; i < wei; i++)
  36.   {
  37.     Wire.write(Digit[cnt[i]]);        // 发送每位数字的段码
  38.   }
  39.   
  40.   Wire.endTransmission();
  41. }
  42. //----------------------------------------------------------
  43. void setup()
  44. {
  45.   Wire.begin(sdaPin, sclPin);  // 初始化I2C总线,使用GPIO7作为SDA,GPIO8作为SCL  
  46.   Display_Data();
  47. }
  48. //----------------------------------------------------------
  49. void loop()
  50. {
  51.   //delay(100);
  52. }
复制代码






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +30 收起 理由
8139 + 30 謝謝分享

查看全部打赏

发表于 5 小时前 | 显示全部楼层
现在Ai还是处于初级阶段,有些事还得靠人工核准和校验
回复 支持 反对

使用道具 举报

发表于 5 小时前 | 显示全部楼层
这个一看就是软件模拟I2C。
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
兴趣不同不相以为谋
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
不明觉厉害。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
8139 发表于 2025-7-21 17:32
现在Ai还是处于初级阶段,有些事还得靠人工核准和校验

确实如此,或许太高级的编程AI不是我能用到的,我感觉这东西作为超级搜索引擎用就好了,能做到普通搜索做不到的并且无推荐、无广告也就不错了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
mmxx2015 发表于 2025-7-21 17:59
这个一看就是软件模拟I2C。

我也觉得是模拟的,只是AI给出的答案弄的挺玄乎的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
wjqok 发表于 2025-7-21 18:08
兴趣不同不相以为谋

临帖是缘,希望以后可以有共同感兴趣的话题来一起讨论。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
我用编程AI,进行表格的vba编程 还是蛮好用的,自己只要学习一些基础的逻辑语句就可以调试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 1 小时前 | 显示全部楼层
z01228 发表于 2025-7-21 21:04
我用编程AI,进行表格的vba编程 还是蛮好用的,自己只要学习一些基础的逻辑语句就可以调试。 ...

确实,AI对于有一点点编程的入门基础的而言绝对是一个不错的帮手,对于新手入门也可以是不错的助力。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-21 23:07 , Processed in 0.265200 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表