谈谈使用Arduino
2015-12-26 15:02
267 查看
这两天接了一个小活是用arduino做一个类似智能家居检测的东西,包括温度、湿度、烟雾检测。对于arduino其实并不是第一次接触,之前和同学一起整过那个3轴的机器手画图,不过当时代码没有亲自写。这次算是完完整整接触了一回。
首先第一感觉就是便宜,一共淘宝了两次,加上七七八八的东西一共100块不到,arduino uno主板才25块钱,倒是有的好的传感器比较贵。毕竟arduino这东西硬件开源,一下大大拉低了价格。其次就是arduino的开发环境,这个也是我觉得为什么他能这么流行起来的原因,非常的straightforward,没有什么devicetree, memory map之类的,直接一个C++的编程环境,一个void setup() 一个void loop(),几行代码就可以点灯、驱动lcd屏,获取传感器数据等,非常的方便,这个世界还是软件的世界,因此适合软件编程才是正道。
整个系统搭起来前前后后也花了多半天时间,要把一件简单的是做好也是挺不容易的,下面讲讲其中一些经验。
1,对于arduino的编程风格,我觉得这个是最重要的,也是我写代码之前在搜索引擎上最想找到的,arduino因为软硬件都开源,所以可以非常好的继承已有的代码,避免重复造轮子,这也是软件编程最大的特点。特别是传感器就那么几种,肯定有别人写好的驱动,现成的库,因此千万不要拿到一个传感器就去找他的datasheet,然后重新写一个时序,这不是arduino的风格,是以前嵌入式单片机的风格。
这里我用的DHT11和LCD1602屏就是用的已有的库文件,其中DHT11是网上找到的,LCD的驱动是arduino开发环境自带的,都是用C++写的,想去看其具体函数实现可以直接查源代码。
2,,开始LCD的使用还是找的中文社区的资料,主要是熟悉硬件的连接方式,后来发现arduino自带库文件之后,发现他官网上是有library的说明的,在这里https://www.arduino.cc/en/Tutorial/LiquidCrystalAutoscroll,比如实现液晶屏文字滚动的效果,看到他.h文件里有个autosroll,但是用了半天总感觉不对,看源代码也没太看出什么门道来,后来仔细看他官网上的描述和示例程序,很快发现并不是我想要的功能,随后用scrollDisplayLeft这个函数实现了想要的功能,目前只有LCD的blink功能没有成功使用,估计是lcd的驱动型号的问题,这个目前使用delay和lcd.clear函数简单替代,暂时也就不深究了。
3,说一点调试方面的经验,arduino可以非常方便的利用串口,只需要一个简单的初始化就可以用其串口来,这是一个非常好的调试手段。目前据我所知arduino的开发环境是没有单步调试的,所以调试还是要善于利用串口print。
4,还想简单说说arduino的library,他在安装目录下面有个library目录,里面有它自带的一些库文件,第三方库文件可以直接放到这个目录就可以正常工作(不过需要重启arduino),其实在arduino的工作目录下,也有一个library目录,第三方库放到这里也可以,同样需要重启arduino。这里我自己也利用C++的类开发了一个无源蜂鸣器的库,可以看到arduino的库都是用面向对象的方式开发的。
5,一个小问题,arduino的int类型是16bit的,这也是昨天debug时间最长的一个问题,这个主要是因为他的单片机是16位的,因此如果有超过32768的数就需要32bit的long类型运算,而且他编译器里面的格式转换是跟运算数对应而非和被赋值的数对应的,也就是两个int类型相乘结果还是int类型,无论赋值到int还是long都用可能出现溢出的问题。有可能C和C++里面就是这么定义的,自己有点忘了:p
总而言之,arduino还是个挺好玩的东西,现在这个时代很适合给小朋友当玩具啊哈哈。
首先第一感觉就是便宜,一共淘宝了两次,加上七七八八的东西一共100块不到,arduino uno主板才25块钱,倒是有的好的传感器比较贵。毕竟arduino这东西硬件开源,一下大大拉低了价格。其次就是arduino的开发环境,这个也是我觉得为什么他能这么流行起来的原因,非常的straightforward,没有什么devicetree, memory map之类的,直接一个C++的编程环境,一个void setup() 一个void loop(),几行代码就可以点灯、驱动lcd屏,获取传感器数据等,非常的方便,这个世界还是软件的世界,因此适合软件编程才是正道。
整个系统搭起来前前后后也花了多半天时间,要把一件简单的是做好也是挺不容易的,下面讲讲其中一些经验。
1,对于arduino的编程风格,我觉得这个是最重要的,也是我写代码之前在搜索引擎上最想找到的,arduino因为软硬件都开源,所以可以非常好的继承已有的代码,避免重复造轮子,这也是软件编程最大的特点。特别是传感器就那么几种,肯定有别人写好的驱动,现成的库,因此千万不要拿到一个传感器就去找他的datasheet,然后重新写一个时序,这不是arduino的风格,是以前嵌入式单片机的风格。
这里我用的DHT11和LCD1602屏就是用的已有的库文件,其中DHT11是网上找到的,LCD的驱动是arduino开发环境自带的,都是用C++写的,想去看其具体函数实现可以直接查源代码。
2,,开始LCD的使用还是找的中文社区的资料,主要是熟悉硬件的连接方式,后来发现arduino自带库文件之后,发现他官网上是有library的说明的,在这里https://www.arduino.cc/en/Tutorial/LiquidCrystalAutoscroll,比如实现液晶屏文字滚动的效果,看到他.h文件里有个autosroll,但是用了半天总感觉不对,看源代码也没太看出什么门道来,后来仔细看他官网上的描述和示例程序,很快发现并不是我想要的功能,随后用scrollDisplayLeft这个函数实现了想要的功能,目前只有LCD的blink功能没有成功使用,估计是lcd的驱动型号的问题,这个目前使用delay和lcd.clear函数简单替代,暂时也就不深究了。
3,说一点调试方面的经验,arduino可以非常方便的利用串口,只需要一个简单的初始化就可以用其串口来,这是一个非常好的调试手段。目前据我所知arduino的开发环境是没有单步调试的,所以调试还是要善于利用串口print。
4,还想简单说说arduino的library,他在安装目录下面有个library目录,里面有它自带的一些库文件,第三方库文件可以直接放到这个目录就可以正常工作(不过需要重启arduino),其实在arduino的工作目录下,也有一个library目录,第三方库放到这里也可以,同样需要重启arduino。这里我自己也利用C++的类开发了一个无源蜂鸣器的库,可以看到arduino的库都是用面向对象的方式开发的。
5,一个小问题,arduino的int类型是16bit的,这也是昨天debug时间最长的一个问题,这个主要是因为他的单片机是16位的,因此如果有超过32768的数就需要32bit的long类型运算,而且他编译器里面的格式转换是跟运算数对应而非和被赋值的数对应的,也就是两个int类型相乘结果还是int类型,无论赋值到int还是long都用可能出现溢出的问题。有可能C和C++里面就是这么定义的,自己有点忘了:p
总而言之,arduino还是个挺好玩的东西,现在这个时代很适合给小朋友当玩具啊哈哈。
相关文章推荐
- Web开发之request
- iOS9.0以后那些被不推荐使用(deprecated)方法之:sendAsynchronousRequest was deprecated in iOS 9、UIAlertView was deprecated
- UI - NavigationController
- LeetCode(115) Distinct Subsequences
- LeetCode(115) Distinct Subsequences
- ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.
- require.js 配置文件研究
- OSGI blueprint Converter的使用
- CSS marquee滚动 长宽怎么设置代码
- . ERROR! The server quit without updating PID file
- Core BlueTooth官方文档翻译
- Xcode7.2核心动画Layer的简单认识使用
- 给 TI BLE 添加自己UUID
- UI - UITableView表视图 ( 一 )
- BNU OJ 51003 BQG's Confusing Sequence
- Android UI设计: 分享一个仿QQ聊天消息提示可以拖拉气泡
- Qt基础——让使用Designer创建的UI也能自动适应窗口大小
- UITextField 常用属性及方法
- UIImagePickerController换头像
- 如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上