编写自己的Arduino库
参考及来源超给力啊:
https://www.cnblogs.com/lulipro/p/6090407.html
https://www.cnblogs.com/lulipro/p/6090407.html
lulipro - 代码钢琴家
学习知识的最大价值在于愉悦自己的大脑,其次才是让自己生存。
- 博客园
- 首页
- 新随笔
- 联系
- 管理
如何编写自己的Arduino库?
一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了。一直想搞清楚,以便编写自己的库文件。于是研究一下午,下面是一些总结。
Arduino工程的初步认识
一、目录规范
当创建一个空的工程,先按下ctrl+s保存一下。这个时候弹出对话框,命名工程。假如命名为LED,并保存在 我自己的Arduino工作目录下 H:\Arduino\workspace\。
于是IDE会自动帮我们在workspace下创建1个文件夹,并将sketch主文件放在里面,而且主文件和文件夹同名。
二、主文件代码框架规范
每一个Arduino程序(Sketch)都有1个主文件,后缀为 .ino ,它是程序的setup 函数和 loop函数所在的文件。
代码框架如下:
void setup() {// put your setup code here, to run once://初始化操作代码放在setup函数中,他们将在程序启动的第一步得到执行 并只执行一次 } void loop() { // put your main code here, to run repeatedly: //将程序的主要逻辑代码,放在loop里。他们将会反复执行下去。 }
有C/C++开发经验的人看到这个程序框架会愣住:我的main函数去哪里呢?
Arduino 为了让更多的人能够使用Arduino平台开发出好玩的东西出来,绞尽脑汁降低门槛,它隐藏了程序的细节,使得开发者将注意力放在实现上。
在Arduino IDE的安装目录下可以找到main.cpp这个代码模板文件,main函数就位于此。文件位置:{Arduino安装目录}\hardware\arduino\avr\cores\arduino\main.cpp,内容如下:
/*main.cpp - Main loop for Arduino sketchesCopyright (c) 2005-2013 Arduino Team. All right reserved.This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */#include <Arduino.h>// Declared weak in Arduino.h to allow user redefinitions. int atexit(void (* /*func*/ )()) { return 0; } // Weak empty variant initialization function. // May be redefined by variant files. void initVariant() __attribute__((weak)); void initVariant() { } void setupUSB() __attribute__((weak)); void setupUSB() { } int main(void) { init(); //硬件初始化 initVariant(); //特有硬件初始化。因为不同的开发板有自己独特的初始化逻辑。 #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; }
在项目中使用多文件
有时会程序越写越大,越大越乱。多文件管理可以解决这个麻烦。Arduino程序可以有多个源代码文件,但只有 1个 主文件,也就是存放 setup、loop函数的.ino文件。
为了使得代码更清晰,我们让主文件用来控制程序的主要逻辑部分,而把具体的细节封装成单个模块,存放在其他的文件中,这样方便管理。
那么怎么创建其他的文件呢???下面开始介绍。
使用无后缀的文件(其实是以.ino为后缀的,只是在IDE中不会显示后缀,而在电脑的资源管理器中会显示.ino , 以下都称为无后缀)
点击下图中标记的按钮,选择第一个选项 【新建标签】,输入文件名即可。
这样我们的工程就有了2个文件了。如下,一个主文件和一个名为LED的文件。这就是最简单的多文件方法。
我不推荐使用这种方法,这是为没有C/C++编程经验的小白准备的,他们不懂函数定义 后还要声明才能使用,不懂得头文件的包含。这些都被Arduino IDE帮他们做了。IDE的具体处理是
Also, this generation isn't perfect: it won't create prototypes for functions that have default argument values, or which are declared within a namespace or class.
使用传统的 C/C++分离式文件
这种方式下,对于一个代码模块,我们需要一对文件:源文件和头文件,即: .c 和.h 或者 .cpp 和 .h 。前者是C语言风格,后者是对会使用C++来说的。官方貌似推崇我们使用C++编写Arduino代码,无论是Arduino 的从标准库,还是教程中,都透露出一股强烈的OOP气息。所以我下面使用C++风格来举例子。
例如我们想要将LED的控制封装成一个模块。一开始我们需要创建2个文件 :LED.h 、 LED.cpp
然后是想清楚我们需要让提供LED控制的哪些操作。发挥你的想象力时候到了。规定操作后,我们先写出头文件,然后写出实现,最后在主文件中使用这个模块。在主文件中使用
#include"LED.h"预处理指令包含。
/******************* LED.h*******************/#ifndef _LED_H__ #define _LED_H__//导入Arduino核心头文件 #include"Arduino.h" class LED { private: byte pin; //控制led使用的引脚 public: LED(byte p , bool state=LOW ); //构造函数 ~LED(); //析构函数 byte getPin(); //获取控制的引脚 void on(); //打开LED void off(); //关闭LED bool getState(); //获取LED状态 void disattach(); //释放引脚与LED的绑定,使得引脚可以控制其他的东西 }; #endif
/***************** LED.cpp******************/#include"LED.h" #include"Arduino.h" LED::LED(byte p,bool state):pin(p) { pinMode(pin,OUTPUT); digitalWrite(pin,state); } LED::~LED() { disattach(); } void LED::on() { digitalWrite(pin,HIGH); } void LED::off() { digitalWrite(pin,LOW); } bool LED::getState() { return digitalRead(pin); } void LED::disattach() //引脚回收,恢复到上电状态 { digitalWrite(pin,LOW); pinMode(pin,INPUT); }
/********************** 实例化1个LED对象,用7号叫控制,让他闪烁10次,并在串口打印出它的状态。 10次完毕后释放回收引脚 **********************/#include"LED.h" LED led(7); byte count =0; void setup() { Serial.begin(9600); } void loop() { if(count<10) { led.on(); delay(300); Serial.print("LED state:");Serial.println(led.getState(),DEC); led.off(); delay(300); Serial.print("LED state:");Serial.println(led.getState(),DEC); ++count; if(count==10) led.disattach(); } }
让它成为你自己的库!
如果上面的模块你觉得好用,符合自己的使用习惯,而且经常要用到,那么你可以将它变成你自己的库文件。这样以后就可以直接拿来用啦。
Arduino的扩展库都是放在 libraries目录下的。
所以我们需要在这个目录下创建一个文件夹,比如上面的例子是LED控制,于是我创建了 m_LED文件夹(前面加m是为了和官方库区分开,这只是我自己的习惯而已)。然后把写好的.cpp 和 .h文件拷贝到里面去,这样就OK了。
这样我们 的主文件就变成了下面这样,是不是很简洁干净呢。
#include<LED.h> //注意,由于LED控制模块已经是标准库了,所以使用尖括号<> 包含LED led(7); byte count =0; void setup() { Serial.begin(9600); } void loop() { if(count<10){ led.on(); delay(300); Serial.println(led.getState(),DEC); led.off(); delay(300); Serial.println(led.getState(),DEC); ++count; if(count==10) led.disattach(); } }
细心的同学会发现 和 LED.cpp 、 LED.h 一起有个 keywords.txt文件,这个是什么用呢? 其实它没有太大的实用性,只是为了配置自定义库的语法高亮。让我们自己的库能在IDE下显示不同的颜色而已。如果不配置,Arduino IDE不能渲染出颜色的。
如果你觉得这个库非常不错,你还可以把它分享给别人使用。我们好像一直都在使用别人的东西,把自己的劳动成果分享出去,也为别人做出贡献,岂不更好?
转载于:https://www.cnblogs.com/MCSFX/p/10942043.html
编写自己的Arduino库相关推荐
- 【Arduino】库分析及如何编写自己的Arduino库
文章目录 方法1:直接添加(不推荐) 方法2:传统的C/C++分离式文件(推荐,但需要具备C++知识) C++分离式编译 C++类构造函数/析构函数 构造函数 析构函数 自写的小车运行库 Arduin ...
- mind+自定义arduino库,实现简易RFID智能家居系统
文章目录 前言(完整用户库下载链接在文章末尾) 一.用户库文件结构 二.配置config.json文件 三.编写main.ts文件 四.编辑资源文件夹 _images _locales _menus ...
- 制作Arduino库——摩斯码
制作Arduino库--摩斯码 前沿 1.文件结构 2.主文件代码 3.自定义Arduino库 3.1.编写.h头文件 3.2.编写.cpp源文件 3.3.编写keywords.txt文件 4.使自定 ...
- FPGA之道(30)编写自己的vhdl库文件
文章目录 前言 编写自己的vhdl库文件 Work库 记录数据类型 子程序介绍 函数 过程 子程序使用总结 程序包 自定义程序包范例 前言 本文节选自<FPGA之道>来一起学习下高阶Ver ...
- 【arduino】继续arduino玩CyberPi童芯派之官方arduino库
微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 昨天文章提到了,github上有个CyberPi童芯派的库,开始以为是哪个大神搞的,感 ...
- 【S操作】轻松优雅库移植解决方案,arduino库移植应对方案
微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 为啥要用arduino?最重要的一个原因就是因为arduino完美的生态,即可以找到很 ...
- 编写自己的Javascript库-1
通过编写自己的Javascript库来提高自己的Javascript水平. 今天先实现两个方法,以后边学习边编写. (function (){ window['SoftLin']={} //等同于 ...
- arduino怎么和C语言程序通信,c – 如何将arduino库与标准C代码一起使用
我正在使用 Eclipse kepler进行AVR开发. 我拥有的代码是C(开源),我已经调整它以便它完美运行.我的目标是ATmega2560,采用arduino mega2560的形式. 使用ard ...
- spdlog linux编译出错,Linux下编写Makefile引入第三方库
Linux下编写Makefile引入第三方库 前言:一直在使用CmakaList 生成Makefile文件,其实很少去写Makefile,但是最近帮朋友处理了一个Makefile引入第三方库的问题,就 ...
最新文章
- 神奇的 SQL,Group By 真扎心,原来是这样!
- 三星自动驾驶汽车路测获批,进军无人驾驶领域
- 人才市场最吃香四个专业,就业前景好,很容易拿到高薪!
- 运维基础(8)shell脚本
- python的api库_python 利用toapi库自动生成api
- java c 语言之父_Java之父评价C语言之父:他是一位天才,c语言撑起了一切
- jmeter负载测试测试_Apache JMeter:随心所欲进行负载测试
- Java-绘图相关技术
- 51单片机IIC驱动OLED
- 云服务器哪家比较好呢?
- 台式计算机显卡是哪个好,台式电脑显卡排行榜
- glassfish4 linux,CentOS 6.5上安装GlassFish4.0 过程笔记
- <C和指针>---生存期和存储类型
- linux pcs 所有命令,BaiduPCS-Go Windows或linux下百度网盘cmd命令行详细使用方法
- 起航---开发基于国产华为鸿蒙操作系统的APP
- 玩转OneNET物联网平台之简介
- 内存快速分配和慢速分配
- The E-pang Palace HDU - 5128
- Python——文档
- 100个台阶,一次走一步,走两步,走三步,有多少种可能
热门文章
- 我的地盘我做主——你必须遵守的Python编码规范
- 《数据库原理与应用》(第三版) 第 5 章 数据类型及关系表创建 基础 习题参考答案
- 数据库开发——MySQL——数据类型——非数值类型
- 【Qt】数据库用户接口层
- 【Linux】一步一步学Linux——ping命令(150)
- python3 mysql报警日志_Python监听MySQL日志
- python一个try块后接一个或多个finally块_Python *与*语句完全等同于一个try – (除了) – finally块?...
- 字符串相加—leetcode415
- Vi编辑器的使用方法
- sql中使用“where 1=1 and ....“ 到底影响效率吗,回答不会也永远不会