本帖最后由 suoma 于 2017-4-3 15:30 编辑
接上一篇帖子
基于SensorTile的数据存储系统设计-软件篇1 - 意法半导体AMG SensorTile开发大赛 - 电子工程世界-论坛
https://bbs.eeworld.com.cn/thread-526275-1-1.html
SensorTile的数据存储系统功能如下:
1、SD数据存储,支持TTL、485通信
2、数据存储前的时间戳添加,方便后期查看
3、时钟可调+液晶显示
4、支持不同通信协议(波特率、数据位、校验位等可变)
时钟设置部分液晶显示函数定义如下
- void Pritime()
- {
- Time t = rtc.time();
-
- lcd.setCursor(0,0); //显示年
- print2digits(t.yr);
- lcd.print('-');
-
- lcd.setCursor(5,0); //显示月
- print2digits(t.mon);
- lcd.print('-');
-
- lcd.setCursor(8,0); //显示日
- print2digits(t.date);
-
- lcd.setCursor(11,0); //显示时
- print2digits(t.hr);
- lcd.print(':');
-
- lcd.setCursor(14,0); //显示分
- print2digits(t.min);
- }
复制代码
按键监测函数定义
- unsigned long LastP;
- boolean buttonPress(byte button)
- {
- if(digitalRead(button)==HIGH) // 检测按键是否按下
- {
- unsigned long NowP = millis();
- unsigned long buttonChange=NowP-LastP; // 与上次按键按下的时间进行对比
- if (buttonChange>500) //按键间隔是否大于500ms
- {
- LastP = millis(); // 记录按键按下的时间
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
复制代码
接下是对按键位判断,进行时间设置,时间设置函数定义
- void SetTime()
- {
- int syear, smonth, sdate, shour, sminute, sdow;
- if(buttonPress(Set))
- {
- lcd.clear();
- delay(200);
- rtc.time(syear, smonth, sdate,shour, sminute);
- bool SetY=true;
- /* ~~~~~~~~~~~~~~~~~~~~~~ 进入年份设置状态 ~~~~~~~~~~~~~~~~~~~~~~~ */
- while(SetY)
- {
- unsigned long Rt=millis()%1000;
- if(Rt<500) // 每500ms闪烁1次
- {
- PritimeSet(syear, smonth, sdate,shour, sminute);
- }
- else
- {
- lcd.setCursor(0,0);
- lcd.print(" ");
- }
- /* ~~~~~~~~~~~~~~~~~~~~~~~~~ 设置年份 ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
- if(buttonPress(Adj))
- {
- syear=syear+1;
- }
复制代码
后面月日、时分设置与此类同,程序过长,不再描述
数据存储部分
文件操作
- File dataFile = SD.open("datalog.txt", FILE_WRITE);
- if (dataFile) {
- dataFile.println(serial.read(),HEX);//读取串口数据并写入
- dataFile.close();
- }
复制代码