到底有没有用arduino教程 UNO+ESP8226弄成功的案例

查看: 6892|回复: 2
arduino之arduino uno与超声波传感器的使用
& & 今天开始玩单片机,选的是Arduino。因为arduino作为单片机入门级别的,使用起来很方便。
& &&&今天做的是加了超声波传感器。
& &&&一般来说,市面上的超声波传感器分为两种:一种是trigger型;一种是寻址发指令型。(这是我自己的定义,如果有错请勿见怪啊!)
& & trigger型比较简单,就是通过一个IO口作为Input,通过高低电压驱动这个trigger,超声波开始工作。然后再用pulseIn(EchoPin, HIGH)计算往返时间,再用公式计算距离。这种方法比较单一,简单,这样的超声波价格较低,精度还不错。可以说是物美价廉。下面贴上代码:
const int TrigPin = 2; //用arduino的数字口2定义为Trigpin,用于输入触发
const int EchoPin = 3; //用arduino的数字口3定义为EchoPin,用于返回时间
void setup()
Serial.begin(9600); //波特率,一般为9600,这里的是串口的,这里用串口实际上是为了用到串口监视器看得到的数据
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
void loop()
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm); //用串口监视器。在arduino IDE的tool的serial monitor那里可以看到监视器。上面
//是send,发送数据,下面是数据print的内容(这是串口发送数据出去的内容,这里就用这个来看收到的数
//据)。rx的串口的接收端,tx是发送端。
Serial.print(&cm&);
Serial.println();
delay(1000);
& & 具体连线:将超声波trigger端和arduino的数字接口2相连,EchoPin端和数字接口3相连,VCC连5v,gnd连地。接着烧入代码,就可以检测到距离了。
& & 另一种是寻址发指令类型的:
& & 这里要用到TTL串口(RX和TX)或者I2C(wire型,总线类型。可以弄几十个超声波)。
& & 在这里我就举TTL串口的例子吧!使用的超声波是KS103
& & 超声波工作原理是主机(就是Uno了)发送指令给超声波,首先是发送超声波的地址,找到地址。如KS103的地址是0xe8,但是uno只能用7位地址的话,就要右移一位了。接着发送指令0x02,这是寄存器,返回的数据就存在里面。然后是指令超声波的工作模式,具体看超声波的文档。下面是代码实现:
#define KS103 0xe8 // default address of KS103 is 0xe8
#define reduce_noise 0x71 // these lines define the data for commands. See data sheat.
#define turn_off_led 0xc1
#define read_distance 0xb0 // distance may be less than 5m .
#define read_brightness 0xa0
#define read_temperature 0xc9
word reading=0; // thease variables are for printing the temperture through Serial.print().
void setup()
Serial.begin(9600); // start Serial transaction
delaydelayMicroseconds(90);
Serial.print(KS103);
delaydelayMicroseconds(90);
Serial.print(0x02);
delaydelayMicroseconds(90);
Serial.print(reduce_noise); // send the noise reduction command to KS103
delay(2000); // wait for being stabilized 2seconds
void loop()
Serial.flush();//清空串口缓存
Serial.print(KS103); // measure the distance
delaydelayMicroseconds(90);
Serial.print(0x02);
delaydelayMicroseconds(90);
Serial.print(read_distance);
if(2 &= Serial.available()) // wait the register available
reading = Serial.read(); // read register 2
reading = reading && 8; // shift the data read to upper byte
reading |= Serial.read(); // read the register 2 to lower byte
//数据一般都是16位的,要两次read才可以都会数据
delay(250); //wait to be read on the screen of PC.
& & 连线如下:将超声波RX与主机TX相连,TX与主机RX相连。VCC和GND就不用说了。
这样就完成了TTL串口的超声波。当然,这里只用到了测距,没有用到温度传感器和亮度传感器。这种超声波传感器是比较高级的,这些传感器上面也都有。
接下来我说一下I2C的超声波使用:限于篇幅,我就简单地贴贴代码:
#define KS103 0xe8 // default address of KS103 is 0xe8
#define reduce_noise 0x71 // these lines define the data for commands. See data sheat.
#define turn_off_led 0xc1
#define read_distance 0xb0 // distance may be less than 5m .
#define read_brightness 0xa0
#define read_temperature 0xc9
word reading=0; // thease variables are for printing the temperture through Serial.print().
word reading2=0;
void setup()
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
Wire.begin(); // join the TWI as the master
Serial.begin(9600); // start Serial transaction
//Wire.begin(KS103);
KS103_command(reduce_noise); // send the noise reduction command to KS103
delay(2000); // wait for being stabilized 2seconds
KS103_command(turn_off_led); // turn off the LED
void loop()
digitalWrite(6,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(7,HIGH);
Serial.println(KS103_read_command(read_distance)); // measure the distance
//Serial.print(& &);
reading = KS103_read_command(read_temperature); // measure the temerature
reading2 = reading & 0x0f;
reading = reading && 4; // shift low byte 4 bits
Serial.print(reading);
//Serial.print('.');
Serial.print(reading2);
Serial.print(&deg.&);
Serial.print(& brightness &);
Serial.print(KS103_read_command(read_brightness)); // measure light
Serial.println(&.&);
delay(250); //wait to be read on the screen of PC.
String reading_temperature(){ // read the temperature data
word reading = KS103_read_command(read_temperature);
word reading2 = reading & 0x0f;
reading = reading && 4; // shift low byte 4 bits
return (String)reading + (String)reading2;
word KS103_read_command(byte command){ // sending the command and read the data in the register
word reading =0;
// step 1: instruct sensor to read echoes
KS103_command(command); // send the command
// step 2: wait for readings to happen
delay(10); // wait 1 milliseconds // I'm not sure if this line is neccesary. I mimic the sketch for other TWI devices.
// step 3: instruct sensor to return a particular echo reading
Wire.beginTransmission(KS103); // start to transmit with KS103
Wire.write(byte(0x02)); // register 2 is the gate of receiving the data
Wire.endTransmission(); // stop transmitting
// step 4: request reading from sensor
Wire.requestFrom(KS103, 2); // request the data in the 2nd and thir register of KS103
// step 5: receive reading from sensor
if(2 &= Wire.available()) // wait the register available
reading = Wire.read(); // read register 2
reading = reading && 8; // shift the data read to upper byte
reading |= Wire.read(); // read the register 3 to lower byte
// return the 16bit data
void KS103_command(byte command){ // send the command to KS103
Wire.beginTransmission(KS103); // start the transmission with KS103
Wire.write(byte(0x02)); // register 2 Wire.write(byte(0x02));
Wire.write(command); // send the command to the register 2
Wire.endTransmission(); // end of transmission
delay(30);//added by chenyu
 好贴怎么没人顶啊?
 不错,KS103超声波还是不错的
Powered by到底有没有用arduino UNO+ESP8226弄成功的案例?[解决] - Powered by Discuz!
后使用快捷导航没有帐号?
查看: 12343|回复: 17
到底有没有用arduino UNO+ESP8226弄成功的案例?[解决]
本帖最后由 diaodiaop 于
09:20 编辑
刚接触这东西 前段时间用了arduino UNO(以下简称arduino)+W5100读取温度上传到yeelink平台成功了.
对于硬件我目前只会简单的传感器之类的东西,什么焊接之类的完全不懂..
现在想换wifi,据说都是采用ESP8226,那么我也从tmaill上买了一个 如下图.
001.jpg (83.86 KB, 下载次数: 2)
11:41 上传
---------------哥哥哥哥-------------------
问题来了...那上面有8跟针 如何跟arduino连接?需要额外的板之类的东西吗??
从网站找了一个图如下
002.jpg (190.38 KB, 下载次数: 7)
11:46 上传
不过板子不一样 我也不知道D18 D19在哪里...下面3跟线2个3.3一个GND我是可以通过&文字&来找到的.
所以我现在不知道TX RX那2个针对应arduino里的哪里...求告知.
---------------哥哥哥哥-------------------
我们现在假设上面的操作完成了,那我现在应该如何让wifi连接我的路由器的热点?
看到很多网上说使用AT命令,这个我是不懂的..还有什么固件之类的 我也是不懂的..
但是你如果给我以下代码我是可以看懂的...(我是纯软件开发)
boolean conf_JAP(String ssid , String pwd)&&//配置登陆网络需要的ssid名称以及密码 {& &Serial.print(&AT+CWJAP=&);& &Serial.print(&&&);& &&&//&ssid&& &Serial.print(ssid);& &Serial.print(&&&);& &Serial.print(&,&);& &Serial.print(&&&);& && &//&pwd&& &Serial.print(pwd);& &Serial.println(&&&);& && &unsigned long start = millis();& &while (millis()-start&18000) &&{& &&&if(Serial.find(&OK&)==true)& &&&{& && && &&&}& &}& & } 复制代码
很明显我是测试没有成功的....就连加入热点都不行
所以我现在改如何下手.......
-----------------------------日 09-06-27-------------------------------------------
感谢论坛的人帮我解决问题...感谢5#的shytian帮我解决问题..是电源的问题..使用2个电池供电就可以了..
并且现在数据已经可以成功POST到各种平台...(等整理好之后我会把接线图以及代码分享)有什么问题也可以Call我
现在是另外一个问题(发送get命令获取返回值.)..此帖已经结贴所以大家请看下面的帖子.
&&arduino自带的3.3v输出电流不够,无法驱动esp8266.你可以用两节五号电池,给esp8266供电(正极接vcc和CH-PD),记得电池的负极和arduino的GND连接
照片是MEGA,不知道MEGA是否会成功,UNO的连接也在连接的帖子中,我试过没有成功。。
林定祥 发表于
照片是MEGA,不知道MEGA是否会成功,UNO的连接也在连接的帖子中,我试过没有成功。。
哎,我也没有测试成功研究好久了.....现在都不知道怎么接线...
用软串口转一下usb串口的输入,调试看看。
正常的话,esp8266模块一上电,模块上会有个蓝灯闪一下然后熄灭
TX,RX分别接arduino板的两个数字口,tx接的口,定为软rx,rx接的口,定为软tx。然后用SoftwareSerial打开这软tx,rx组成的串口,就可以和模块通信了。
有用UNO+ESP8266上yeelink的吗?
有用UNO+ESP8266上yeelink的吗?
johndragon 发表于
TX,RX分别接arduino板的两个数字口,tx接的口,定为软rx,rx接的口,定为软tx。然后用SoftwareSerial打开这 ...
有用UNO+ESP8266上Yeelink的吗?
Powered byESP8266 WIFI模块实现远程wifi控制 - Arduino论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
Hot [活动]
ESP8266 WIFI模块实现远程wifi控制
等待验证会员
11:54:12  
31406&查看
& && & 大家好& &,今天给大家分享一下自己做的 用WiFi模块来控制开关。 使用 arduino UNO搭建硬件所需配件:
uno 效果图.jpg (31.43 KB, 下载次数: 2)
11:46 上传
因为UNO只有一对串口,已经被WIFI模块占用了,所以要增加一个转串口的板子 ,用软串口来打印串口信息。
& & 使用ITEADUINO&&MEGA2560搭建硬件所需配件:
mega2560效果图jpg.jpg (27.17 KB, 下载次数: 2)
11:48 上传
此处也可以使用Arduino MEGA2560,但是需要飞线到后面的TX2和RX2。这个就交给小伙伴们自己去尝试吧,成功后可以发到帖子回复里跟大家分享。
需要使用到的库文件地址: 这个库跟之前发的库是一样的,但很多小伙伴反应编译不过,这个库我是用1.0.6版本的IDE测试一定能过的。不放心的朋友可以把以前下的库从libraries里移除,重新下载这个到libraries文件夹里面。
库默认设置的是UNO可以直接使用本教程,无需做任何修改。使用mega2560的时候,只需要打开uartWIFI.h文件,把UNO注释掉,取消注释MEGA,如下:
//#defineUNO& && &&&//uncommentthis line when you use it with UNO board#defineMEGA& && &//uncommentthis line when you use it with MEGA board代码(略)资料还在整理等整理好了 在上传上去, 如果有对这个项目感兴趣的 可以加扣扣 .
接线图.jpg (23.52 KB, 下载次数: 3)
11:50 上传
Foca转串板连接的是D2和D3作为软串口。G要共地ITEADUINO MEGA2560接线如图
此处的Xbee扩展板的跳帽应该是2和3,而不是0和1,此处有错。正确跳帽如下:&&& &.&&.&&.4
& & ._.&&.3
& &&&.&&._.2
& &&&.&&.&&.1
& &&&.&&.&&.0
Xbee扩展板插在TX2和RX2这排排母上。如图:
7.jpg (11.84 KB, 下载次数: 3)
11:51 上传
连接电脑,插上9V/1A适配器电源供电,打开ArduinoIDE串口监视器就可以查看wifi运行状态了。如果是使用UNO,打开监视器后需要先按一下UNO板子上的重启键再按一下xbee扩展板上的重启键。此时才能看到串口监视信息。使用mega2560则无需操作。如果是出现“Modulehave no response”则只需要按一下mega板子侧边的重启键。
成功连接路由器后,我们就得到了WiFi模块的IP地址,串口打印信息如下:&&在arduino&&ide 就可以看到&&
10.JPG (9.18 KB, 下载次数: 1)
11:52 上传
接下来,就需要安装手机APK了。下载地址: 该软件目前只支持4寸-7寸安卓智能手机或者平板,7寸平板的话排版可能会有空隙,不过不影响使用。
等待验证会员
11:55:17  
希望对arduino感兴趣的朋友 能够一起分享
01:14:56  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
非常感谢,需要的东西!
01:22:15  
把程序发上来看看
等待验证会员
15:41:30  
好,感谢分享,有空也玩玩!
22:02:03  
ESP8266, 楼主玩MT7681 吗?
09:45:17  
看图上Foca转串板上接了一个东东,是什么东东啊
09:40:10  
深度学习中~~~~~~~~~~~~~~~~~~~~~~·
09:30:20  
路过 看看看看看
09:49:01  
好东西,大家分享,谢谢楼主
22:14:30  
好……………………………………………………………………
10:55:26  
先码一个,感觉会用到
21:50:45  
路过,学习了。。。。内容还不错啊& && && && && && && && && &&&
14:04:32  
十分感谢你的分享 ,这种精神值得所有人学习 但是你的topic里 开发板都是买的 ,价格不菲啊
11:20:41  
楼主这个搞得好像太复杂了,
esp8266本身还有个性能比mega 328P性能强得多的mcu,可以跑自己写的程序,做wifi开关,外带个继电器足矣。
楼主这还是用AT指令控制esp8266,好原始的感觉
22:04:28  
这个局域网控制,不能叫远程控制
16:24:36  
这个可以实现web远程控制 101.200.82.72:1212 没有域名.直接ip的可以试试
助理工程师
13:17:38  
学习了& &谢谢分享,内容还不错~~~~~& &
09:00:51  
不错 先收藏&&抽空学习学习
15:05:54  
十分感谢你的分享 ,这种精神值得所有人学习
工程师职场
Powered by13449人阅读
Arduino(9)
上两篇说了ESP8266的连接调试,相信大家按照前两篇的方法已经能够把ESP8266用起来了,同时调试工具的使用也应该有所了解了,这一篇讲讲重点,如何将ESP8266模块跟我们的arduino连接起来。大家应该知道,ESP8266是使用串口来进行数据通信的,同样连接到我们的arduino上也要用到我们的串口,百度了一下,还真找到了相关的连接资料,相关资料连接在此《》。
这里我用的板子是Arduino UNO的,跟文章中使用的板子不同,UNO是只有Serial,没有Serial1的,所以要实现相关功能需要使用软串口的方式进行连接,这里我们将Digital10和Digital11两个口配置成软串口,注意模块使用的是3.3V电压的电源,需要引出UNO主板3.3V口的电源接到ESP8266模块上,然后将CH_PD针脚连接到VCC上,Arduino主板接到USB上,这时模块正常供电后蓝色灯闪两下,红色灯常亮,模块正常启动~~
打开Arduino IDE,输入以下代码,编译上传到arduino中~~
注意:以下代码10为RX,11为TX口,连接模块的时候要注意跟模块的针脚交叉连接
#include &SoftwareSerial.h&
SoftwareSerial mySerial(10, 11); // RX, TX 配置10、11为软串口
void setup()
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
// wait for serial port to connect. Needed for Leonardo only
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
void loop() // run over and over
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
打开串口监视器,选择波特率为9600,同时选择回车选项,重新拔插一下8266模块的电源,这时会看到串口监视器显示一串英文信息,说明模块已正常工作,如下图
欢迎加QQ群,共同交流学习~~
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:166079次
积分:1364
积分:1364
排名:千里之外
原创:21篇
评论:38条
(1)(1)(2)(1)(1)(2)(1)(3)(1)(1)(1)(6)(2)查看: 26069|回复: 117
完全分享利用Arduino制作的单片机控制4头滴定
本帖最后由 zizii 于
22:39 编辑
IMG_6569.JPG (139.81 KB, 下载次数: 61)
19:28 上传
先贴出最后的成品,采用Arduino控制,红外线遥控设置。
功能介绍:
1、4头滴定,每路一路启动时间一路滴定时间。
2、采用Apple盒子的遥控器控制设置。
3、断电记忆,重新启动后不用重新设置。
4、1分钟自动锁定,防止干扰和不明真相的群众改动设置。
5、可以手动启动任何一个泵头,启动到设置的时间后自动关闭。
看完该帖子,动手能力ok的人可以完全自己采购零件和参考我贴出的程序做一个一样的出来。
以前做的那个8头滴定移步看这里:
原来那个造价800左右,8头,但是每次设置必须联网或者通过串口连接电脑设置,不好用。
后来去朋友家玩过BM那个,有屏幕操作起来的确方便一点,不过1200块3个头,还是觉得划不来。
再后来研究了一下Arduino这个单片机,发现原来我想要的控制器就在身边(谷歌Arduino)。
采购,全部淘宝,先申明一下,该DIY的成本并不便宜(大概1000左右,最重要的是看泵头,从几十到几百一个),甚至贵过一些成品。
但是它可以完全按照自己的想法来运作,最重要的,它可以随时升级,支持更多的功能和联动更多的设置,例如LED模拟日出、直流造浪等等,都可以用几行代码搞定。
好了,下面开始看图说话。
IMG_6554.JPG (112.22 KB, 下载次数: 61)
19:28 上传
整个控制电路:
1、Arduino UNO r3 一块,淘宝50-80,建议买改进版本的带插针的,接线方便很多。
2、Arduino I2C 2004 LCD 一块,淘宝30-50。
3、Arduino I2C/IIC DS3231 高精度时钟模块一个,淘宝十几块。
4、Arduino 3线按钮一个,用来控制解锁的,几块钱一个。
5、Arduino 数字38KHz红外接收模块一个,十来块。
6、Arduino 4路继电器一个,30左右。
基本上就上面这些吧,当然,还要12v1A电源一个,25cm宽的大盒子一个,泵头尺寸5.5宽一个。
IMG_6550.JPG (63.88 KB, 下载次数: 63)
19:28 上传
屏幕大概就是这样,2004的意思就是每行20个字可以显示4行,不过只支持英文,够用了。
IMG_6557.JPG (165.76 KB, 下载次数: 60)
19:28 上传
哦,补充一点,还有4个电源模块,可以参考我之前那个滴定,我新买的这个带电压显示,调整起来方便一点。
搜索LM2596S,DC-DC模块,用来精确调正滴定泵速度的,基本可以做到1秒1ml这个样子。
关于泵头,我之前的帖子有分析过,不过真心买不起步进电机的,用了一款性价比还不错的,运行安静:
IMG_6475.JPG (45.6 KB, 下载次数: 63)
19:40 上传
图片是淘宝上面的,就是这款感觉还行,98一个。
IMG_6558.JPG (176.75 KB, 下载次数: 64)
19:28 上传
安装了控制板和电源板,刚开始我将交流电源也装在里面,结果发现干扰太严重,基本单片机无法工作,所以这个图片是告诉大家,不要把AC-DC模块放在一起。
IMG_6565.JPG (162.02 KB, 下载次数: 60)
19:28 上传
去掉了交流电源以后,只保留了控制板和滴定泵,把线都接好。
IMG_6566.JPG (154.12 KB, 下载次数: 60)
19:28 上传
最后一步接上屏幕,基本上硬件部分就ok了。
线是怎么接的,其实不用我画电路图出来,因为你在淘宝购买的每一个Arduino模块都带有接线图。
你要做的只是把他们用杜邦线连接起来而已。
大概接法:
1、Arduino 主板IIC接口接时钟模块,时钟模块再串接屏幕(这里可能要给时钟模块焊接插针)。
2、Arduino 主板I数字12接口,接按钮。
3、Arduino 主板I数字11接口,接红外线。
4、4路继电器6根线,电源对接,4个控制线接Arduino 主板数字7-10接口。
5、继电器输出开关接12v电源给4块DC-DC电源板。
6、DC-DC输出直接接泵头。
IMG_6570.JPG (180.92 KB, 下载次数: 61)
19:28 上传
详细介绍一下屏幕功能设置。
第一排,显示日期和温度(这个是模块温度,没啥用,跟天气温度差不多)。
第二排,显示时间,后面的“____”显示4个泵头是否工作,工作会显示1234.
第三排,4个泵头启动的时间。
第四排,4个泵头启动持续时间,如果1秒1ml也可以理解为滴定多少ml。
程序楼下再贴。
(140.53 KB, 下载次数: 84)
19:28 上传
本帖最后由 zizii 于
22:37 编辑
程序太长,不让直接贴,还是下载附件吧。
其实代码才是整个滴定制作的重点,下面我简单注释一下代码:
#include &Wire.h&
#include &EEPROM.h&
#include &IRremote.h&
#include &DS3231.h&
#include &LiquidCrystal_I2C.h&
包含头文件,跟c语言是很类似的,本身Arduino使用的就是C语言。
#include &Wire.h&
#include &EEPROM.h&
这两个是系统自带的。
#include &IRremote.h&
这个是外线现控制模块的
#include &DS3231.h&
这个是时间模块的。
#include &LiquidCrystal_I2C.h&
这个是LCD液晶显示的。
附件的代码有一处错误,请查看53楼的修复代码。
19:54 上传
点击文件名下载附件
3.2 KB, 下载次数: 2511
const String Ver = &V1.1&;
常量,版本,这个无所谓啦。
int BTN_PIN = 12;
int LED_PIN = 13;
定义按钮在数字接口12,用来解锁屏幕的。
定义LED在数字接口13,我没用这个。
int IR_RECV_PIN = 11;
红外线在数字接口11。
bool IREnabled =
默认红外线接收打开。
unsigned long IREnabledTime = 60000;
定义1分钟后自动关闭红外线控制。
int RELAY_PINS[4] = {7, 8, 9, 10};
继电器接在数字接口7-10
bool RelayOn[4] = {false, false, false, false};
4个继电器是否在工作。
int RelayStartHour[4] = {18, 19, 20, 21};
4个继电器开始的时间,18代表下午6点。
unsigned long RelayRunSecond[4] = {60, 60, 60, 60}; // Default 1 minute
继电器每次工作多长时间,默认1分钟。
unsigned long RelayOnTime[4] = {0, 0, 0, 0}; // Countdown to close relay
用来控制继电器到时间关闭的。
union EEPROMData {
&&unsigned char c[4];
bool DataChanged =
这个联合体用来往单片机写入和读取数据,断电不用重新设置就是因为有这个,EEPROM。
int CursorPos[2] = {15, 1};
设置模式下光标的位置。
unsigned long setModeTime = 1000;
bool SetModeOn =
是否在设置模式,默认1秒钟没操作就关闭设置模式。
这里简单说明一下:因为这个液晶屏幕不能分开操作字符显示位置和光标显示位置,所以每次刷新屏幕光标位置都会到最后一个字符的位置。
因而增加一个模式,记录每次刷新后都恢复显示当前操作的光标位置。
LiquidCrystal_I2C LCD(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
DS3231 C // DS3213 Clock
IRrecv IR(IR_RECV_PIN);
decode_results IRR
unsigned long lastIRCode = 0;
这些都是常规变量设置。
int second, minute, hour, day, month, year,
bool h12, PM;
bool Century =
时间相关的变量。
bool backLight =
unsigned long backLightTime = 5000;
液晶显示背光显示和自动5秒关闭。
Arduino主程序一般只有2个函数,一个setup函数用来初始化端口和设置一些初始值,复位后或者断电重开后会运行一次。
一个loop函数,会一直重复运行,这里面放需要检测或者显示的东西。
void setup() {
&&pinMode(BTN_PIN, INPUT); //设置按钮输入接口
&&pinMode(LED_PIN, OUTPUT); //忽略
&&for (int i = 0; i & 4; i = i + 1) {
& & pinMode(RELAY_PINS[i], OUTPUT); //设置4个继电器输出接口
&&Wire.begin(); // Start the I2C interface 串口界面开始
&&Serial.begin(9600); // Start the serial interface 串口波特率设置
&&IR.enableIRIn(); // Start the receiver 红外线开始接收
&&LCD.init(); // Initialize the LCD 初始化屏幕
&&if (backLight) //是否打开背光
& & LCD.backlight();
& & LCD.noBacklight();
&&ReadFromEEPROM(); // Read relay options from EEPROM 从存储器读出以前的设置。
void loop() {
&&if (!IREnabled) { //如果锁定,则跳过所有红外线命令
& & IR.resume();
&&} else { //执行红外线命令
& & RevIR();
&&if (!SetModeOn) { //设置模式下,所有显示不刷新。
& & DisplayTime(); //刷新时间
& & DisplayRelay(); //刷新继电器设置显示
& & DisplayIR(); //刷新是否锁屏
&&CheckBtnClicked(); //检测按钮,有按下解锁。
&&CheckRelayClock(); //检测是否到时间启动滴定泵头。
&&AutoCloseIR(); //自动关闭红外线接收,默认1分钟锁定。
&&AutoCloseLight(); //自动关闭背光,默认5秒。
&&AutoCloseRelay(); //自动关闭继电器控制,也就是关闭滴定头。
&&AutoExitSetMode(); //自动退出编辑模式,默认1秒退出。
//红外线接收解析,我这里采用家里的苹果盒子带的那个遥控器,其实家里大多数遥控器都能用,重要的是稳定。
//我之前用小米盒子的遥控器,居然同一个按钮会出现好几个不同的编码,质量真心不咋的。
void RevIR() {
&&unsigned long resultIRC
&&if (IR.decode(&IRResults)) {
& & BackLight5s(); //有接收到命令,自动打开背光5秒。
& & SetIREnabled(true); //延迟锁定,复位锁定计数
& & //Apple IR Controler
& & //0x77E1D04B UP
& & //0x77E1B04B DOWN
& & //0x77E1104B LEFT
& & //0x77E1E04B RIGHT
& & //0x77E1404B MENU
& & //0x77E17A4B PLAY
& & //0x77E1BA4B OK
& & resultIRCode = IRResults.
& & if (resultIRCode != 0xFFFFFFFF) {
& && &lastIRCode = resultIRC
& & } else {
& && &resultIRCode = lastIRC
& & switch (resultIRCode) {
& && &case 0x77E1404B: //Menu
& && &&&SetModeStatus(false); //菜单按钮,退出编辑模式
& && &&&ReadFromEEPROM(); //从存储器重新读一次设置
& && &&&DisplayVer(); //显示软件版本
& && &case 0x77E17A4B: //Play
& && &&&SetModeStatus(false); //播放按钮,退出编辑模式
& && &&&SetIREnabled(false); //锁定屏幕,红外线接收退出,需要按钮解锁
& && &case 0x77E1BA4B: //OK
& && &&&SetModeStatus(false); //确认按钮
& && &&&WriteToEEPROM(); //写入设置数据
& && &case 0x77E1D04B: //Up
& && &&&SetPosValue(1); //设置当前位置的设定值+1
& && &&&SetModeStatus(false); //退出编辑模式(刷新屏幕)
& && &case 0x77E1B04B: //Down
& && &&&SetPosValue(-1); //设置当前位置的设定值-1
& && &&&SetModeStatus(false);
& && &case 0x77E1104B: //Left
& && &&&SetModeStatus(true);
& && &&&SetCursorPos(-1); //设置当前光标位置左移一位
& && &case 0x77E1E04B: //Right
& && &&&SetModeStatus(true);
& && &&&SetCursorPos(1); //设置当前光标位置右移一位
& & Serial.print(&IR:&);
& & Serial.println(IRResults.value, HEX); //在窗口显示接收到的红外线编码,可以配对家里几乎所有的遥控器。
//这也是用这套系统最好玩的地方,几乎所有的东西都可以自定义。
& & delay(80);&&// delay in between reads for stability
& & IR.resume();
剩下的就自己看附件的代码吧,分享完毕。
高手,谢谢楼主分享~
非常感谢,非常感兴趣,如果有问题再请教楼主!
技术帝,这个只能膜拜
太强悍了!
真厉害,而且里面的布局也很漂亮。要是能再紧凑点就更好了。
支持一个,非常棒的滴定!
支持贡献源代码的
好帖!!!
真TMD的厉害
最近正打算模拟mp的控制器做一个造浪控制,也用arduino来搞,很好玩。
支持一下.牛人
楼主 能不能pm一下所有淘宝地址
Powered by}

我要回帖

更多关于 arduino ide 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信