# SIM800C开发 **Repository Path**: mmcandymm/sim800-c-development ## Basic Information - **Project Name**: SIM800C开发 - **Description**: Ardunio UNO+SIM800C进行开发调试 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-10-20 - **Last Updated**: 2026-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SIM800C开发 # 介绍 Ardunio UNO+SIM800C进行开发调试,主要实现拨打电话的功能。 # 元件 SIM800C开发板(自己整个天线信号好一点,且据说使用移动卡的信号会更强一点)、老年机扬声器、老年机麦克风、Ardunio UNO开发板、0.91OLED显示屏、面包板、杜邦线、USB2TTL(CP2102,这个是进行调试SIM800C的,后面用处不大) # 功能测试 1. SIM800C模块测试 2. 5x3按键矩阵功能测试 3. 0.91英寸OLED模块测试 ## SIM800C模块测试 模块在PDD中的【Akurele科技】买的,之前买过几个,有一个被我烧了、一个没信号,他家的还不错(但是莫得天线自己弄一个吧)。注意要想接**麦克风**和**喇叭**的话,需要看看板子上有无【SPKN & SPKP】和【MICP & MICN】端口,这几个端口会连扬声器和麦克风,一定看仔细。 1. 关于SIM卡,小卡不行,需要买个**SIM转换器**,否则可能识别不了,找不到信号 2. 关于焊接: 1. PWX和GND焊接在一起 2. SPKP连接喇叭+、SPKN连接喇叭- 3. MICP连接麦克风+、MICN连接麦克风- 4. 最好整个天线连上,信号好 3. 使用USB2TTL进行测试: 1. 5V连接SIM800C的5V,GND连接SIM800C的GND 2. TXD连接【SIM800C的RXD】,RXD连接【SIM800C】的TXD 4. 之后打开【端口调试助手】(我用的是**Serial Port Utility**),不过好像需要和商家要一下USB2TTL的驱动安装一下 1. 选择对应的波特率,界面如下: ![串口调试助手](/Image/image.png) 2. 等模块上小灯显示有SIM信号了(两次闪烁之间隔了3s),就可以输入AT指令进行测试了,具体的AT指令可以在【SIM800C开发板用户手册V2.0.pdf】中找到 > 比如我要呼叫100086=>需要输入`ATD10086;`,这里有个英文的分号,不要弄错 ## 按键矩阵功能测试 这里考虑到需要进行电话号码的输入以及拨号和挂断,所以使用了5x3的按键矩阵(实际上买了4x3和1x3)的,然后接起来变成了5x3的,按键如图: ![Alt text](/Image/image-1.png) >原理说明:4x3的矩阵有`4+3`根线,左四根线代表行,右三根代表列,1x3的矩阵同理。所以我们可以将小按键矩阵的列和大矩阵的列连在一起,这样就得到了5x3的矩阵按键。 参考资料:[矩阵按键](https://www.yiboard.com/thread-1795-1-1.html) ### Ardunio代码实现 需要使用KeyPad库,在`工具-管理库`中搜索`keypad`: ![Keypad库](/Image/image-2.png) 上面给出的参考资料中出现的是4x3矩阵的代码,故这里只展示说明5x3矩阵按键的代码,完整代码在`button.ino`中: 1. 引入库,给出键盘初始信息 ```C++ #include const byte ROWS = 5; //矩阵键盘行-五行 const byte COLS = 3; //矩阵键盘列-三列 // 每个位置对应的键盘中的内容 char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'}, {'g','y','r'} }; //指定 行 连接Ardunio的引脚 byte rowPins[ROWS] = {12, 11, 10, 9, 8}; //指定 列 连接Ardunio的引脚 byte colPins[COLS] = {7, 6, 5}; ``` 2. 现在所有按键信息已经设置好了,接下来就是创建keypad对象: ```C++ //创建对象 Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); ``` 3. 接下来就是获取按键信息,这里使用`keypad.getKey()`函数,返回值是按键信息,返回值为-1表示没有按键,返回值为按键信息表示按键了。 ```C++ void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey();// Read the key // Print if key pressed if (key){ Serial.print("Key Pressed : "); Serial.println(key); } } ``` 4. 连接矩阵按键和Ardunio,这里使用的是Ardunio UNO,所以使用的是`Arduino UNO`的引脚,具体连接方法需要对应代码中的设计,详见初始信息设置部分。本代码中,行连接的是`{12, 11, 10, 9, 8}`引脚,列连接的是`{7, 6, 5}`引脚。 5. 上传代码到板子进行测试: ![矩阵按键代码测试](/Image/image-3.png) ## OLED显示屏功能测试 还是老样子,可以直接显示英文和数字,但是不能显示汉字,不过我们可以通过字体取模软件(PCtoLCD)来将自己转换为对应的点阵显示,这个后面详细说明。 1. 首先还是需要安装用到的库,在`工具-管理库`中搜索`Adafruit_SSD`,他会提示你要不要安其他的-**全安**就行。 ![安装OLED库](/Image/image-4.png) 2. 接下来我们先把OLED连到Ardunio UNO板子上: * VCC-5V * GND-GND * SCL-A5 * SDA-A4 3. 之后我们之间运行示例,先看看显示屏能不能正常显示,在`文件-示例-`中打开程序,烧写,就可以看到**花里胡哨**的动画啦: ![OLED示例](/Image/image-5.png) > 如果你的板子显示正常,那么恭喜你,可以继续进行下面的内容了。要是有什么异常显示,直接找商家对线吧。 4. [CSDN良心up](https://blog.csdn.net/weixin_43662566/article/details/121259723)上有一篇代码可以直接跑,命名为`OLED.ino`,直接复制到Ardunio中,然后烧写,就可以看到OLED正常显示了: ```C++ // 0.91寸屏幕配置 #include #include #include #define OLED_RESET 4 //不用改 #define screen_x 128 //屏幕宽度 #define screen_y 32 //屏幕高度 // 初始化SSD1306 Adafruit_SSD1306 display(screen_x, screen_y, &Wire,OLED_RESET); void setup() { display.begin(SSD1306_SWITCHCAPVCC,0x3C); } void loop() { display.clearDisplay(); // 清屏,如果没有清屏,会显示初始内容 display.setTextColor(WHITE);// 开像素点发光 display.setTextSize(2);// 设置字体大小 display.setCursor(15,15);// 设置显示位置(x, y) display.println("good"); display.display(); // 开显示 } ``` ![显示英文](/Image/image-6.png) > 这里需要说明的是,原始的函数输出只能是默认字体、且只能是英文和数字,所以想要输出中文或自己找的好看字体的话,需要用到**字体取模**软件,字体一般是分两半显示。 5. 取模软件使用,关键在于配置问题,这个我整整花费了一天时间弄明白。关键的选项是【顺向 OR 逆向】以及【逐列 OR 逐行 OR 行列 OR 列行】,据网上资料说,屏幕不同则配置不同。其实可以略过这一部分,直接看**优化部分**,这部分绕了弯路。 > 如果设置**汉字**宽度是`16x16`,则**英文和字母**宽度就是`8x16`。我这里的需求是横着显示内容,所以配置如下【顺向行列】: ![Alt text](/Image/image-7.png) >气死我啦!!根本就是**显示屏的问题**,之前显示屏不管怎样的取字模方式都显示不正确,还好我把那个显示屏烧了,换了个新的,不然根本不知道原来的显示屏有问题!!! >以下是不同顺序和读取方式的显示效果图以及对应的代码,其中`h= 16, w= 8`: |顺序|读取方式|代码|效果图| |-|-|-|-| |顺向|逐行|`display.drawBitmap(0, 0, s[0], w, h, SSD1306_WHITE);display.drawBitmap(0, 8, s[1], w, h, SSD1306_WHITE);`|![顺向逐行](/Image/image-11.png) |顺向|行列|`display.drawBitmap(0, 0, s[0], h, w, SSD1306_WHITE);display.drawBitmap(8, 0, s[1], h, w, SSD1306_WHITE);`|![顺向行列](/Image/image-12.png) |顺向|逐列|`display.drawBitmap(0, 0, s[0], w, h, SSD1306_WHITE);display.drawBitmap(0, 8, s[1], w, h, SSD1306_WHITE);`|![顺向逐列](/Image/image-9.png) |逆向|列行|`display.drawBitmap(8, 0, s[0], h, w, SSD1306_WHITE);display.drawBitmap(0, 0, s[1], h, w, SSD1306_WHITE); `|![逆向列行](/Image/image-10.png) |顺向|列行|`display.drawBitmap(0, 0, s[0], h, w, SSD1306_WHITE);display.drawBitmap(8, 0, s[1], h, w, SSD1306_WHITE);`|![顺向列行](/Image/image-13.png) |逆向|行列|`display.drawBitmap(8, 0, s[0], h, w, SSD1306_WHITE);display.drawBitmap(0, 0, s[1], h, w, SSD1306_WHITE); `|![逆向行列](/Image/image-14.png) ## OLED动画显示 由于笨人是个铁狒狒+cv工程师,所以在网上找到了[Ardunio UNO动画代码](https://animator.wokwi.com/)+[Ardunio模拟器](https://wokwi.com/projects/379629274209411073),巨巨巨巨好用!! 需要注意的是,这个**动画代码**中要改一个地方: ``` #define SCREEN_I2C_ADDR 0x3D // or 0x3C //上面这句是原来的,改为0x3C,如下 #define SCREEN_I2C_ADDR 0x3C ``` Ardunio模拟器在VScode中也可以直接使用插件(算了吧好像**要钱**...只能试用...不值得...网页版就很好使)... ## OLED显示优化版 汉字好像不需要拆成两部分显示,可以使用**竖向逐行**的方式进行采样,配置如下图,之后在`Ardunio UNO`代码中设置对应的宽高就可以: ![配置图](/Image/image-15.png) 比如我要显示`26x26`大小的`开`: ![26x26的开](/Image/image-16.png) 对应的显示代码如下: ```C++ static const unsigned char PROGMEM pic[]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x18, 0xE1, 0xE0, 0x00, 0x00, 0xE1, 0xE0, 0x00, 0x00, 0xE1, 0xE0, 0x00, 0x00, 0xE1, 0xE0, 0x00, 0x00, 0xE1, 0xE0, 0x00, 0x00, 0xE1, 0xE0, 0x00, 0x00, 0xE1, 0xE7, 0x00, 0x7F, 0xFF, 0xFF, 0x80, 0x20, 0xE1, 0xE0, 0x00, 0x00, 0xE1, 0xE0, 0x00, 0x01, 0xC1, 0xE0, 0x00, 0x01, 0xC1, 0xE0, 0x00, 0x01, 0xC1, 0xE0, 0x00, 0x01, 0xC1, 0xE0, 0x00, 0x03, 0x81, 0xE0, 0x00, 0x03, 0x01, 0xE0, 0x00, 0x07, 0x01, 0xE0, 0x00, 0x0E, 0x01, 0xE0, 0x00, 0x38, 0x01, 0xE0, 0x00, 0x70, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,/*"开",0*/ }; display.drawBitmap(0, 0, pic, 26, 26, 1); //画出字符对应点阵数据 display.display();//开显示 ``` > 当然显示图片是同样的道理,这里就不多啰嗦了。 > 【注】这里字符数组的数据类型是`static const unsigned char PROGMEM`千万千万写对,如果只写`const unsigned char`会乱码!!!!