2019-12-07 17:37:05 Great__Wang 阅读数 298
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    693 人正在学习 去看看 陈贤能

本文针对以下问题:

  1. 需要导入自建库,不知道入口;
  2. 需要修改或者删除自建库,发现怎么操作都没用的;
  3. 想要修改官方库,或者将修改后的官方库覆盖无效的;

目录

导入库相关

卸载库相关


由于Arduino的版本较多,这里只讲1.7.10和1.8.10版本的导入和卸载过程,前后的版本均可参考。

导入库相关

Arduino的导入库的原理是将放在一个文件夹或者一个.zip文件中的所有文件复制到某个特定的地方(不一定是你安装Arduino的地方),并刷新自己的文件树,将所有文件包含在默认的库函数内,只要include了头文件即可使用库文件中所有函数。因此若出现修改你以为的那个库文件无效的情况下就需要去找真正的库文件的位置了。

导入库文件前需要确保将相应的头文件和库文件(Arduino是C++,理论上可以用C)放入一个文件夹或一个.zip文件,然后选择项目->导入库->添加库(1.7.10版本)或者项目->加载库->添加.zip库...

1.7.10导入库位置
1.7.10导入库位置
1.8.10导入库位置

 选择后弹出如下界面:

选择含有库文件的文件夹或.zip文件,点击打开即可。 

卸载库相关

目前没有找到很有效的卸载方法,只能进行删除,删除源文件的库仍然会在列表里,但include时不会再冲突,但是要注意的是Arduino的库不在一开始指定的位置,也不一定在Arduino自身的库文件位置。需要用点手段试出来,这里就将错就错,修改某个该库文件的函数,重复定义或者缺少参数均可,或者本来就有错,Arduino IDE会报错,在报错信息里就能找到这个文件被复制到哪了,比如:

1.7.10一般就在C盘下的”文档“文件夹里
1.8.10有可能在原位置,但还是会复制出来一个在C盘,不去处理这个没用

 找到这个位置,接下来就可以去相应文件位置进行修改或者删除以保证程序正常运转。

2019-03-03 17:38:42 Naiva 阅读数 368
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    693 人正在学习 去看看 陈贤能

如何编写自己的Arduino库?
arduino教程(提高篇)——编写扩展库
Arduino 扩展库的制作(官网原文件精细翻译)–附详细实例

注意:

  • 记得keywords.txt文件中disattach(关键字)与KEYWORD2之间用tab,不是空格。
  • 如果扩展库里包含得有其他扩展库,例如我扩展库里面用到了软串口库SoftwareSerial就一定要在你使用之前,在arduino的IDE里面不仅要包含你自己编的扩展库,还得包含软串口库==(例如#include <Motor1.h>下面加一句#include <SoftwareSerial.h>)==
2018-09-28 13:29:16 weixin_43300573 阅读数 4461
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    693 人正在学习 去看看 陈贤能

新建文件后以下操作:如图
在这里插入图片描述
同理在创建一个.h的书签如图在这里插入图片描述
最后效果如下两个书签的名字一定要一样。
在这里插入图片描述
下边上三个文件夹的代码,详细讲解我过程中报错的原因。在代码里汉字提醒
主文件

#include "GAME.h"
GAME we;//实例化 一定不能少   直接用的话标签名的话 报错 we可随意改注意保持上下一样即可
void setup() 
{  
  we. part_init();
   Serial.begin(9600);
}
void loop() 
{ 
 char inChar = (char)Serial.read();
 char  cha;int i;
   if (inChar == '1') 
    {
      we.arrows_create(33,18,23,28); //实例化的名.函数名  中间有点
      we.arrows_delete(49,34,39,44);
      we.arrows_delete(65,50,55,60); i=1;  inChar='a';  
    }
 if (inChar == '2') 
    {
       we.arrows_create(49,34,39,44);
       we.arrows_delete(33,18,23,28);
       we.arrows_delete(65,50,55,60);
         i=2;
        inChar='b';
    }
    if (inChar == '3') 
    {
        we.arrows_create(65,50,55,60);
        we.arrows_delete(49,34,39,44);
        we.arrows_delete(33,18,23,28);

         i=3;
        inChar='c';
    }
    if(inChar == '4'&& i == 1 )
       { 
        RSCG12864B.clear();
       }
  
     
}

.cpp的代码

#include"GAME.h"
#include <RSCG12864B.h>//注意位置
#include "Arduino.h"//一定不能少
void GAME::part_init()//函数都是这样        标签名字::想创的函数名   中间两个冒号
{
  
   RSCG12864B.begin();//串口初始化
   RSCG12864B.brightness(255);//
   char c1[]={0xCD,0xF5,0xD5,0xDF,0xC8,0xD9,0xD2,0xAB,0,};//
   char c2[]={  0xD0, 0xC2,0xB5, 0xC4,0xD5, 0xF7,0xB3,0xCC,0,};//
   char c3[]={0xC7,0xB0,0xCA,0xC0,0xD6,0xAE,0xC2,0xC3,0,};//
   char c4[]={0xCD,0xCB,0xB3,0xF6,0xD3,0xCE,0xCF,0xB7,0,};//
   char c5[]={0XD6,0XA7,0XB3,0XD6,0X32,0X44,0XBB,0XE6,0XCD,0XBC,0};//
   RSCG12864B.print_string_16_xy(32,0,c1);//
   RSCG12864B.print_string_12_xy(40,20,c2);//
   RSCG12864B.print_string_12_xy(40,36,c3);//
   RSCG12864B.print_string_12_xy(40,52,c4);//
}
void GAME::arrows_create(int q,int m,int n,int a)
{
  int i,y;
  RSCG12864B.draw_fill_rectangle(22,n,31,a);
   for(i=31;i<=37;i++)
   { q=q-1;m=m+1;
    for(y=m;y<=q;y++)
   RSCG12864B.draw_line(i,m,i,y);//18,33
   }
}
void GAME::arrows_delete(int q,int m,int n,int a)
{   int i,y;
   RSCG12864B.delete_fill_rectangle(22,n,31,a);
   for(i=31;i<=37;i++)
   { q=q-1;m=m+1;
    for(y=m;y<=q;y++)
   RSCG12864B.delete_line(i,m,i,y);
   }
}

.h代码

#ifndef _GAME_H__
#define _GAME_H__
#include <RSCG12864B.h>//这个我调用里边函数了,库文件在我博客里12864B i2c里 你们自制可以不加
#include"Arduino.h"  //一定有不能删

class GAME//换自己的标签名
{
private://函数内部用  是冒号不是分号

public://函数外部用  是冒号不是分号
void part_init();//到这里标签名不写,直接写函数名
void arrows_create( int q,int m,int n,int a);
void arrows_delete(int q,int m,int n,int a);
};//分号不要忘

#endif

下边是我的代码效果图串口监视发送 1 2 3 4有惊喜。
在这里插入图片描述
之后新建文件夹 将 .cpp和.h 移动到 新建的文件夹中名字不要和原文件名重复
找到自己arduino安装位置 文件移动到//arduino//libraries中
这个是我的途径D:\Program Files (x86)\Arduino\libraries
文件夹放在libraries中
我的这个方法 每次调用前 除了有头文件外还要有实例化 。

实例化 其实可以省 ,楼主看不懂 keyword.txt操作。很难受。
就这么多了,希望大佬多指点指点。

2016-01-05 18:17:58 liucheng5037 阅读数 8166
  • arduino实战

    学习如何在arduino中使用各种传感器,包括人体红外传感器,超声波传感器,舵机控制,温湿度传感器,激光接收传感器等,空气质量传感器,wifi模块等....课程内容会不断的更新增加,只要发现比较有趣的传感器就会做对应的实战视频

    693 人正在学习 去看看 陈贤能

一直想使用arduino平台来控制ESP8266模块,现在终于差不多实现了,从网上找来了一个相关的库文件,已经实现了大部分功能,但仍有部分功能需要优化,比如smartlink部分未加入。

在这里首先感谢ITEAD提供的文章帮助,http://www.arduino.cn/thread-7540-1-1.html

我的平台是arduino uno ,只有一个串口,为了方便仿真,我选择使用软件来串口来与ESP8266通信,注意软串口缓存默认是64byte , 需要改为128 byte或更高,来适应wifi串口。

文件SoftwareSerial.h

#define _SS_MAX_RX_BUFF 128 // RX buffer size for wifi 

于是有如下定义:

SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 */
ESP8266 wifi(mySerial,115200);//刚开始默认波特率为115200

D3口用作RX,D2口用作TX

经过测试软串口只有在发送的时候可以支持到115200的波特率,在接收时会有乱码,但是wifi模块出厂默认是115200的波特率,所以我们需要发送指令将115200改为9600。

	wifi.SetBaud(9600);//设置波特率
	wifi.SetBaud(9600);
	mySerial.begin(9600);
建议多将指令发送几次,保证wifi模块接收到指令,完成后将自身的波特率改到9600。

串口改变指令原来的库里是没有的,这里要更改库文件,添加如下方法:

ESP8266.cpp

/*******************************************************************************
* 函 数 名 :SetBaud
* 函数功能 :设置波特率
* 输    入 :baud - 波特率
* 输    出 :true success   false - fail
*******************************************************************************/
bool ESP8266::SetBaud(uint32_t baud)
{
	return eATUART(baud);
}

bool ESP8266::eATUART(uint32_t baud)
{
    rx_empty();
    m_puart->print("AT+UART=");		
	m_puart->print(baud);
	m_puart->println(",8,1,0,0");
	return recvFind("OK");	
}

接下来在同样的文件下我们来实现smartlink功能,smartlink需要在30s内完成,需要注意的是若smartlink失败,需要使用smartstop指令来关闭这个连接

//add by LC 2016.01.05 16:27
bool ESP8266::smartLink(uint8_t  type,String &link_msg)
{
	return eATCWSMARTSTART(type,link_msg);
}

//add by LC 2016.01.05 16:27
bool ESP8266::stopSmartLink(void)
{
	return eATCWSMARTSTOP();
}

/*******************************************************************************
* 函 数 名 :eATCWSMARTSTART
* 函数功能 :启动smartlink模式,需要在30s内连接
* 输    入 :type 启动方式 0 -AL-LINK    1 - ESP-TOUCH    2 - AIR-KISS
			link_msg 返回的SSID和PSD
* 输    出 :无
*******************************************************************************/
bool ESP8266::eATCWSMARTSTART(uint8_t type,String &link_msg)//add by LC 2016.01.05 16:27
{
	bool flag;
    rx_empty();
    m_puart->print("AT+CWSMARTSTART=");
    m_puart->println(type);	
	flag = recvFind("OK");
	if(flag == false) return flag;
	delay(50);//延时之后等待自动连接
	rx_empty();
	return recvFindAndFilter("OK", "SMART SUCCESS", "\r\n\r\nOK", link_msg,30000);
}

/*******************************************************************************
* 函 数 名 :eATCWSMARTSTOP
* 函数功能 :停止smartlink
* 输    入 :无
* 输    出 :无
*******************************************************************************/
bool ESP8266::eATCWSMARTSTOP(void)//add by LC 2016.01.05 16:27
{
    rx_empty();
    m_puart->println("AT+CWSMARTSTOP");	
	return recvFind("OK");	
}

下面就是使用方法,在smartlink.ino 文件,该函数必须在初始化或断线的时候调用

/*******************************************************************************
* 函 数 名 :AutoLink
* 函数功能 :自动连接,前10s自动连接,若连接失败则进入smartlink模式30s,若依然失败
*            则再次回到自动连接,直到连接成功
* 输    入 :无
* 输    出 :无
*******************************************************************************/
void AutoLink(void)
{
	int8_t status = STATUS_LOSTIP;
	while(status != STATUS_GETIP)
	{
		uint32_t start_time = millis();
		Serial.println("start auto link");
		//10s自动连接时间
		while((millis() - start_time < 10000) && status != STATUS_GETIP)
		{
			status = wifi.getSystemStatus();
			delay(500);
		}
		
		//连接失败进入smartlink模式 30s
		if(status != STATUS_GETIP)
		{
			String link_msg;
			Serial.println("start smartlink");
			wifi.stopSmartLink();
			
			if(true == wifi.smartLink((uint8_t)AIR_LINK,link_msg))
			{
				Serial.println(link_msg);
				start_time = millis();//等待获取IP
				while((millis() - start_time < 5000) && status != STATUS_GETIP)
				{
					status = wifi.getSystemStatus();
					delay(500);
				}				
			}else
			{
				wifi.stopSmartLink();
				delay(500);
				Serial.println("link AP fail");
			}
		 }			
	}
	Serial.println("link AP OK");
}

下面简单介绍下几个重要的方法:

ESP8266(SoftwareSerial &uart, uint32_t baud = 9600)

初始化与wifi模块连接的串口,注意波特率


bool restart(void)

复位模块方法,建议在初始化时调用,并在设置波特率之后


String getIPStatus(void)
该方法在不同的连接状态下返回值和格式不同,如下:

AT+CIPSTATUS


STATUS:3
+CIPSTATUS:0,"TCP","192.168.31.136",8080,0


OK


AT+CIPSTATUS


STATUS:2


OK


int8_t getSystemStatus(void)

新增的方法,获取系统当前状态,直接返回值,方便前端调用和判断

实现方法如下:

#define STATUS_GETIP 2 //获取到IP
#define STATUS_GETLINK 3 //建立连接
#define STATUS_LOSTLINK 4 //失去连接
#define STATUS_LOSTIP 5 //未获取到IP
/*******************************************************************************
* 函 数 名 :getSystemStatus
* 函数功能 :获取系统状态
* 输    入 :无
* 输    出 :返回状态
*******************************************************************************/
int8_t ESP8266::getSystemStatus(void)
{
    String list;
    eATCIPSTATUS(list);
	
	int32_t index = list.indexOf("STATUS:");
	if (index != -1) {
		index += 7;
		char status = list.charAt(index);
		return status - 0x30;//返回状态
	}else
	{
		return -1;
	}
}

uint32_t recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout = 1000)
接收网络数据,返回的是实际接收的长度,注意这里的timout参数,具有死延时的问题,也就是在1s内只能接收一帧数据,建议把这个值调小,但不能调为0,不然无法接收数据。


OK,关于该文章的相关库文件和工程下载地址:http://download.csdn.net/detail/liucheng5037/9400821。如有什么问题,欢迎大家交流!


没有更多推荐了,返回首页