个人学习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 的连接

悬空即拔掉跳线帽

短路即插上跳线帽

地址的选取参考下面表格:

A0A1A2ADDR
短路短路短路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()函数!

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值