发个DS3231的定时警报研究
本帖最后由 a461624201 于 2018-6-22 02:53 编辑虽然别人的代码多如牛毛,自己也发个,毕竟是自己九牛二虎之力折腾出来的,也借鉴论坛其他人的部分代码。
这个代码是串口显示的,虽然是实现闹钟功能,但是没有加入蜂鸣器的发声代码,有空在说吧,
修改时间是:s年(后2位),月,日,星期,时,分,秒;,如”s18,6,20,5,19,30,10;”(18年,6月20日,星期5,19点30分,10秒),
修改闹钟警报1时间是:a时,分,秒,o(或者c,打开或者关闭定时闹钟),11110(时间只要到秒,就警报);,如“a19,50,10,o,11000;”意思是19:50;10 定闹钟,
修改闹钟警报1时间是(注意只有时分):b时,分,o(或者c,打开或者关闭定时闹钟),11110(时间只要到秒,就警报);,如“b19,50,o,11000;”意思是19:50;10 定闹钟,打开闹钟,到这个时分秒就会响,
5位的代码需要看代码注释或者3321的PDF来理解,还有INTCN默认是1的,所以当闹钟到时,SQW会出现一次低电平,方便使能arduino ,唤醒,另外每周星期几或者一个月里的固定多少号定闹钟没有加入串口控制代码,这个不难。 学习了。:):):):):):) 本帖最后由 a461624201 于 2018-6-22 17:55 编辑
改进,增加定时模式显示,根据5位和4位代码不同选择不同的定时情景,这个代码主要目的是理解,离实用性还有点远,这个模块其实主要运用在这几种的模式的处理上。
代码对于12小时的显示和定时没加入,有空在说。
* Dy A1M4 A1M3 A1M2 A1M1 Rate
* X 1 1 1 1 Once per second
* X 1 1 1 0 Alarm when seconds match
* X 1 1 0 0 Alarm when min, sec match
* X 1 0 0 0 Alarm when hour, min, sec match
* 0 0 0 0 0 Alarm when date, h, m, s match
* 1 0 0 0 0 Alarm when DoW, h, m, s match
*
* Dy A2M4 A2M3 A2M2 Rate
* X 1 1 1 Once per minute (at seconds = 00)
* X 1 1 0 Alarm when minutes match
* X 1 0 0 Alarm when hours and minutes match
* 0 0 0 0 Alarm when date, hour, min match
* 1 0 0 0 Alarm when DoW, hour, min match 本帖最后由 a461624201 于 2018-6-24 17:16 编辑
根据这个帖子《nrf24l01通信问题》,改进双工NRF24L01,由DS3231定时控制唤醒,
代码初始设置为:clie1arduino的3231定时每个55秒发生INTCN控制SQW电平,控制arduino INT0中断,唤醒断电的arduino,10秒内,把DS3231的温度发送到serv01的arduino,并且反馈回clie1的arduino,10秒后断电NRF24L01,断电arduino。
然后,等待3231下次定时唤醒。
照片中,睡眠中的arduino在200MA电流表,指针到了0ma(手上没有更低量程),发送大概20ma,TX arduino和RX arduino 7脚的LED为收发显示和反馈信号显示,TX arduino 8脚LED为 唤醒指示,
另外听说INTCN的SQW信号有时不能准确定时产生中断这个现象,有待继续试验才知道。
还有TX和RX的数据数量默认8个,可以任意手动修改到32个,随便增加些其他要发送的内容,另外ds3231是24进制。
这个系统可以应用于只能使用电池节能却不需要频繁发送数据的场合,而且是准确时间发送数据,发完就开始NRF和ARDUINO断电模式。
论坛类似的帖子《2月2号-外置采集温度_让arduino用2颗5号电池运行1年以上》,和他的TX代码比较,我写的比较多, 是把NRF和3231库粘在一起,而且TX,RX都使用串口查看数据,最大定时每月多少号唤醒,最小定时每分钟在多少秒唤醒,
第一张图是clie1和serv01Mirf.payload = 17;每次17个字符,这样把时间都发给clie1,这个临时代码不在附件文件。
我另一个目的是树莓派,还没搞定,但放上大神的树莓的NRF24L01代码。C语言测试有效果,但是需要改进,https://github.com/at1a5-lxc 本帖最后由 a461624201 于 2018-6-28 14:49 编辑
更新一下,说明:
1.使用二对串口,第二串口5 脚RX 6脚TX。
2.’年月日设置必须对应正确星期,否则会一直报警1,
3.必须不停的Clock.checkIfAlarm,否则SQW低电平后不会复位。
4。使用328P的EPPROM保存定时模式和唤醒时间,所以不要频繁修改唤醒时间和定时模式。
5, 8脚为报警指示LED ,7脚为发送显示。主串口TX到第二串口RX,主串口RX到第二串口TX(这个连接时,TX arduino无法进行串口设置时间和警报)
对主机 arduino主串口设置年月日 输入命令为 msn18,2,2,2;
if(ml=="sd")设置手动发送到RX arduono msd;
if(ml=="zd") 设置自动发送时间和温度 到RX arduono mzd;
if(ml=="xq") 显示DS3231 mxq;
if(ml=="sn") 设置年月日 msn18,2,2,2;
if(ml=="ss")设置时间 mss,12,12,12;
if (ml=="sa") 设置警报1 msa3,3,3,o,11110(打开警报,3点3分3秒,模式为:每秒进行定时,测试定时在3秒唤醒)
if (ml=="sb") 设置警报2 msb3,3,o,1110
if(ml=="sh") 设置唤醒 时间 msh33;
if(ml=="sx") 设置休眠开关 msx0;(暂时是0打开休眠,1关闭休眠) mirf库双工有时出现问题,还没搞懂,但是根据这个帖子<<Arduino DIY航模遥控器第一步 ---搞定nRF24L01!>>改造的模拟SPI nrf24l01控制。 赔付您的研究精神:) 本帖最后由 a461624201 于 2018-7-5 11:25 编辑
除了分享,也把这个帖子做个网盘,时间久了,我也会忘记,放上树莓派控制nrf24l01,
发送端arduino使用的库来自帖子<认真的nrf24l01库 5路接收通道 2月6号_更新用户模式选择>,
树莓接收端,使用github.com老外写的,但我又找不到了,只找到了这个很类似,https://github.com/jpbarraca/pynrf24,这里还没研究,
我修改一些变量名用作理解,代码没有整理,有点乱,有空更新.
树莓python本来用的带数据包的ACK全双工,我还没全懂,就先关闭了AckPayload,有空搞,另外论坛ACK全双工也似乎没有,
本帖最后由 a461624201 于 2018-7-6 23:27 编辑
有点小激动,双工的arduino ACK_PAYLOAD实现了,这个论坛里似乎没人写这个内容,
我根据百度文库中这位仁兄的经验<24L01+带数据包的ACK,用于双向传输>,非常好用,
上次的DS3231的半双工控制,结果老是乱码,这个就很厉害,同好们可以自己体会什么叫做全双工.
根据文库那位仁兄说法,全双工下,可以自由发送指令给四轴,同时也随时监控到四轴飞行状态,确实很实用.
函数采用: 帖子<认真的nrf24l01库 5路接收通道 2月6号_更新用户模式选择> 本帖最后由 a461624201 于 2018-7-8 13:40 编辑
根据https://github.com/jpbarraca/pynrf24 ,
arduino发 树莓派收 ,双工的arduino ACK_PAYLOAD实现,
树莓派GPIO22被IRQ触发.这个IRQ在树莓中可以关闭也可以打开.
arduon函数采用: 帖子<认真的nrf24l01库 5路接收通道 2月6号_更新用户模式选择> 本帖最后由 a461624201 于 2018-7-11 15:03 编辑
STC单片机的,源码来自http://www.rationmcu.com/51mcu/1085.html,改ACK_PAYLOAD,做接收. JSON+NRF24L01
页:
[1]