Arduino
前言
对于arduino的学习,我入门是通过《arduino程序设计基础(第二版)》这本书(马上也就要出第三版了),不过我学习过程中依然感觉后面越来越难,深奥,希望大家看这本书学习时候能先学习C/C++(必要),还有计算机组成原理相关课程(非必要,但有很大用处),相对于stm32的开发,arduino要相对简单很多,也适合非硬件开发的用来培养兴趣,学习arduino可能会踩很多坑,初期还是建议大家买对应套件学习虽然很不实惠,但是方便呀!
关于一些arduino遇到的名词解释
sketch
直接理解为程序就好了,Arduino的创立者比bai较谦虚,认为在Arduno上执行du的Program都是小小的一坨简简zhi单单的东西,所以dao就用“素描,轮廓,速写”这个意思的英文单词来表示Arduino的程序,也即:sketch。
unit8_t是什么数据类型
首先强调的是unit8_t,unit16_t等不是什么新的数据类型,他们只是用typedef给类型起的别名。_t的意思是表示一个结构的标注,可以理解为type/typedef的缩写,表示它是通过typedef定义的,而不是其它数据类型。
按照posix标准,一般整形对应的*_t类型为:
1字节 uint8_t
2字节 uint16_t
4字节 uint32_t
8字节 uint64_t
关于VScode环境的搭建
本来是不想写这个的,因为网上一大堆教程,但是就是太多太杂了,都不知道哪个是对是错,我为此配置了几小时才不出现报错,十分难受,所以写下这个成功流畅避免更多人耽误时间!
因为arduino也是基于c语言,所以做arduino的vscode环境配置先学习c语言的环境配置大有好处,所以希望大家可以先移步我的另外一篇blog,关于vscode下C/C++环境的搭建,学习一下基础知识,当然如果也可以直接照搬也是可以用的,下面我将介绍配置环境的过程,对我踩的坑做一些说明:
首先对于arduino的一些设置
点击Arduino IDE中的文件->首选项,然后进行配置界面,将语言选择为英语(因为用vscode译码时候输出会对中文语言出现一些乱码,初步判定是bug),将允许使用外部编辑器框选上,这样会让Arduino IDE就只能对程序查看不可编写了!
在VScode中的一些配置操作
首先下载Arduino插件(作者是Microsoft),创建一个存放存放.ino文件的文件夹,用来存放相关文件和配置文件。
然后打开你所创建的那个文件夹,一定是打开文件夹,在该文件夹下创建一个子文件夹,名称就叫做“.vscode"用来存放配置文件的,在该文件夹下创建两个子文件”Setting.josn""c_cpp_properties.json“,(运行后,VScode会在当前工作区的.vscode文件下创建Arduino.json和c_cpp_properties.json两个文件,这是必要的设置文件,不必在意,即使删掉也会自动重建)网上很多人都是将相关信息直接配置在全局配置下,我不喜欢这样,因为全局配置会对你编写其他语言时候也产生影响,最好的方式是在局部配置中配置相关语言所需要的命令语言。但是有些命令是必须建立在全局配置中才有用,在局部配置中保存后会变暗,代表只能全局配置中书写生效。
使用局部配置的好处,比如"c_cpp_properties.json“你在局部配置中做修改只会影响这个文件夹(这个工作区)的效果,比如你在这个工作区这个文件中加入Arduino的库文件路径那么就只会在该工作区生效!
局部配置的各个.json文件的内容(可直接搬用,做一些路径修改即可)
settings.json
{
"terminal.integrated.inheritEnv": false,
"task.autoDetect": "off",
"arduino.path": "C:\\software\\ardunio\\Arduino",//必要的,且要根据自己ArduinoIDE实际安装位置修改
"C_Cpp.intelliSenseEngineFallback": "Disabled",//必要的,用来递归查找Arduino库文件
"C_Cpp.intelliSenseEngine": "Tag Parser",//必要的,用来递归查找Arduino库文件
"arduino.commandPath": "arduino_debug.exe",
"arduino.logLevel": "info",
"arduino.enableUSBDetection": true,
"arduino.disableTestingOpen": false,
"arduino.skipHeaderProvider": false,
"arduino.additionalUrls": [
"https://raw.githubusercontent.com/VSChina/azureiotdevkit_tools/master/package_azureboard_index.json",
"http://arduino.esp8266.com/stable/package_esp8266com_index.json"
],
"arduino.defaultBaudRate": 115200,
"arduino.openPDEFiletype": false//arduino以前版本的文件叫做PDF
}
c_cpp_properties.json(包括esp8266请看下面补充)
这个大家不要自己创建文件直接搬用,在自动生成文件中做出修改,主要再在生成的文件中对“includePath”和“browse”中的库路径进行补充!(可能生成的没有“browse”不用管,修改“includePath”即可)该文件是不允许有注释的,所以搬用时候自己去除掉注释
这里介绍一下相应的arduino库文件在哪里找,一共三处。两个位置是在arduinoIDE安装目录下,还有一个是在文档目录下
{
"configurations": [
{
"name": "MinGW",
"intelliSenseMode": "gcc-x64",
"compilerPath": "C:\\software\\MinGW\\mingw64\\bin\\gcc.exe",
"includePath": [
"${workspaceFolder}",
"C:\\Users\\liyihang\\Documents\\Arduino\\**",//在默认配置中添加库文件的路径(**就是递归搜查当前文件夹下所有子目录,位置在 文档->Arduino)
"C:\\software\\ardunio\\Arduino\\**",//在默认配置中添加库文件的路径(arduinoIDE默认安装位置)
"C:\\software\\ardunio\\Arduino\\hardware\\arduino\\avr\\**"//在默认配置中添加库文件的路径(在arduinoIDE默认安装目录下可找到hardware文件夹,然后hardware->arduino->avr)
],
"defines": [],
"browse": {
"path": [
"${workspaceFolder}",
"C:\\Users\\liyihang\\Documents\\Arduino\\**",//在默认配置中添加库文件的路径(与上面相同)
"C:\\software\\ardunio\\Arduino\\**",//在默认配置中添加库文件的路径(与上面相同)
"C:\\software\\ardunio\\Arduino\\hardware\\arduino\\avr\\**"//在默认配置中添加库文件的路径(与上面相同)
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
在vscode界面要选择开发板型号和端口
选完开发板型号和端口就可以编译上传了。
对于一些问题的解释
如何解决头文件和标识符未定义的问题
这个问题如果按照我的步骤进行是不会出现的,该问题的出现的原因是C/C++ intellisence无法找到arduino库文件的报错,上面对于c_cpp_properties.json的配置(路径补充就是解决这个问题),settings.josn文件中也要补充上"C_Cpp.intelliSenseEngineFallback": "Disabled",//必要的,用来递归查找Arduino库文件
"C_Cpp.intelliSenseEngine": "Tag Parser",//必要的,用来递归查找Arduino库文件
这两句命令,用于启动C/C++ intellisence插件的递归查找子目录功能。
对于端口无法选择问题
这属于vscode中arduino插件的bug,在右下方点击端口提示查找不到端口(虽然连接上了),解决办法,在arduino.josn文件中指定端口是什么,如图所示,输入"port":"自己的端口号“
(可以利用ArduinoIDE查看端口是什么)
在vscode中开发arduino编译巨慢解决办法
每次在vscode中, 编译Arduino花费的时间巨长,仔细一看每次在Arduino 输出控制台上会出现一个警告[Warning] Output path is not specified. Unable to reuse previously compiled files. Upload could be slow. See README.
解决办法:只需在.vscode -> arduino.json文件中将输出目录 output 配置一下就可以大大提高二次下载的编译速度。
"board": "arduino:avr:uno",
"sketch": "arduino UNO\\duorenwu\\duorenwu.ino",
"port": "COM5",
"output": "./build",//在当前文件夹创建名字为bulid的文件夹作为输出目录
"debugger": "stlink-2.1"
}
对于串口监视器无法打开的问题
大家如果无法选择端口的话还是回溯版本吧,现在插件的版本0.3.4有bug,中文乱码,无法选择端口,无法打开串口监视器,最后一个问题实在无法解决,只有回溯版本了,下载安装老版本的插件,关闭vscode插件自动更新功能。
对于使用I2C通信的1602lcd输入只显示第一个字符问题
对于淘宝商家那里下载来的LiquidCrystal_I2C-master库有问题,大家移步到GitHub中下载点击这里
构建ESP8266开发环境(补充)
只需要把esp8266的库文件路径补充进去即可,完整的c_cpp_properties.json文件代码如下
{
"configurations": [
{
"name": "MinGW",
"intelliSenseMode": "gcc-x64",
"compilerPath": "C:\\software\\MinGW\\mingw64\\bin\\gcc.exe",
"includePath": [
"${workspaceFolder}",
"C:\\Users\\liyihang\\Documents\\Arduino\\**",//在默认配置中添加库文件的路径(**就是递归搜查当前文件夹下所有子目录,位置在 文档->Arduino)
"C:\\software\\ardunio\\Arduino\\**",//在默认配置中添加库文件的路径(arduinoIDE默认安装位置)
"C:\\software\\ardunio\\Arduino\\hardware\\arduino\\avr\\**",//在默认配置中添加库文件的路径(在arduinoIDE默认安装目录下可找到hardware文件夹,然后hardware->arduino->avr)
"C:\\Users\\自己电脑的用户名\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.7.4\\**",//补充esp8266的开发库文件的位置
"C:\\Users\\自己电脑的用户名\\AppData\\Local\\Arduino15\\packages\\esp8266\tools\\**"//补充esp8266的开发库文件的位置
],
"defines": [],
"browse": {
"path": [
"${workspaceFolder}",
"C:\\Users\\liyihang\\Documents\\Arduino\\**",//在默认配置中添加库文件的路径(与上面相同)
"C:\\software\\ardunio\\Arduino\\**",//在默认配置中添加库文件的路径(与上面相同)
"C:\\software\\ardunio\\Arduino\\hardware\\arduino\\avr\\**"//在默认配置中添加库文件的路径(与上面相同)
"C:\\Users\\自己电脑的用户名\\AppData\\Local\\Arduino15\\packages\\esp8266\\hardware\\esp8266\\2.7.4\\**",//补充esp8266的开发库文件的位置
"C:\\Users\\自己电脑的用户名\\AppData\\Local\\Arduino15\\packages\\esp8266\tools\\**"//补充esp8266的开发库文件的位置
],
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": ""
},
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
关于LiquidCrystal_I2C库文件的使用
与LiquidCrystal库文件的使用相比,主要区别是初始化有所区别:
LiquidCrystal_I2C lcd(0x27,16,2);
初始化对象中有三个参数,分别对应 地址(0X20-0X27)、列、行
地址取决于转接板上A0 A1 A2 的连接
悬空即拔掉跳线帽
短路即插上跳线帽
地址的选取参考下面表格:
A0 | A1 | A2 | ADDR |
---|---|---|---|
短路 | 短路 | 短路 | 0X20 |
悬空 | 短路 | 短路 | 0X21 |
短路 | 短路 | 短路 | 0X22 |
悬空 | 短路 | 短路 | 0X23 |
短路 | 短路 | 悬空 | 0X24 |
悬空 | 短路 | 悬空 | 0X25 |
短路 | 悬空 | 悬空 | 0X26 |
悬空 | 悬空 | 悬空 | 0X27 |
关于u8g2库的学习(u8glib的增强版)
推荐学习深入学习Arduino u8g2 OLED库-单片机菜鸟哥
关于oled和lcd另外两个库“Adafruit_GFX.h"和"Adafruit_SSD1306.h"库的使用介绍,推荐学习 《博哥OLED系列》- 玩转SSD1306-12864 OLED Adafruit_GFX 和 Adafruit_SSD1306库
补充u8g2库一些函数的用法:
u8g2.setDrawColor(1); //设置颜色,0透显,1实显,2XOR (drawCircle,drawDisc,drawEllipse和drawFilledEllipse不支持XOR模式)
系统学习ESP8266
学习ESP8266我只选 单片机菜鸟哥
博客学习记录:
未能get到millis()的妙用,所以寻找资料发现了如何用millis()取代delay()的用法和原因:摘自一板论坛用户风筝(完整),现在做一些重要摘要供复习参考:
1.delay()函数都会暂停程序延迟函数传递的时间。因此,如果我们给出1秒的延迟,则处理器在1秒钟之前不能进入下一条指令。类似地,如果延迟是10秒,则程序将停止10秒,并且处理器将不允许进行下一指令,直到10秒过去。这妨碍了微控制器在速度和执行指令方面的性能。
2.millis()函数使用100%的CPU性能而不会在执行指令时产生任何延迟。 millis()函数只返回自Arduino开发板开始运行当前程序以来没有冻结程序所经过的毫秒数。
3.文中提到了延时抖动这个名词(消抖),什么是抖动,为啥要消除抖动,抖动要怎么消除,三个问题解释一下。
(1).什么是抖动:
通常按键所用的开关都是机械弹性开关,当机械触点断开,闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动。这是我画的丑图,按键一按下时会产生一连串的抖动;
(2)为什么要消除抖动:
按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40-50ms左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的抖动处理。当检测到按键状态变化时,不是立刻去响应动作,而是先等待闭合或者断开稳定后在进行处理。
(3)抖动如何消除,用delay()函数?不!用millis()函数!