使用Aduino储存数据,并建立webserver,可查询TF卡中的数据
项目概述
一台设备只有单纯的检测功能,没有数据记录,更没有联网,利用Arduino做记录数据,并在网页端查看。
Arduino的一个IO脚接收设备的输出信号,每输出1个下降沿计数+1,数据存在本地,当日累计记录,网页可查看。
思路
1、本套记录查询系统不能干扰生产检测。
2、建立时钟;
3、开机创建以日期命名的文本,存在TF卡中;
4、自检,时间、电压等数据存入文本;
5、用中断来接收外部信号,采集必要的数据,存入文本;
6、建立网络服务器,用循环来检测是否有访问请求;
7、判断到有请求,将当天的文本上传至网页;
8、设置看门狗,文本读取超时后重启。
最终效果
硬件
TF卡内文件(arduino自己创建的文件日期是2000年)
进行压力测试,20秒一个触发信号,一天产生4000+条数据(约150K的TXT文件),由于同时还要处理中断函数,网页访问经常会导致arduino无法发送完整的文档数据,转而处理中断。TF卡中数据完整,时钟一天偏1秒。读取时间依然较长,应该是.read()只能读一个字符的缘故。
更新:在文本上传前关闭0号中断,上传完毕打开中断,可避免重启。测试4000+数据,读取时间40多s,网页端数据完整,TF卡内数据正常,无重启。
网页查询,显示当日记录
材料准备
项目 | quantity |
---|---|
电脑 | 1 |
arduino mage (uno内存太小) | 1 |
USB线 | 1 |
W5100扩展卡 | 1 |
8G TF卡(配读卡器) | 1 |
网线 | 1 |
DS1307模块 | 1 |
杜邦线 | 4 |
程序结构
硬件模块淘宝买现成的,全套成本约100元。
主要是程序设计,
arduino 的程序结构很明确,
可分为以下5个部分:
-引用文件 #include <xxxx.h>
-声明变量 int xxxx = 0;
-自定义函数 void xxxx()
-初始化程序 void setup()
-循环程序 void loop()
初始化程序 void setup()
1、初始化串口
2、初始化中断
3、初始化IIC
4、初始化时钟
5、初始化网络连接
6、初始化指示灯
7、初始化TF卡
8、若当日第一次开机,则获取时钟,创建当日文本。若非当日第一次开机,则跳过。
9、读取AD量,打开当日文本写入开机时间和AD值,保存退出。
建议每一类需要确认的代码后在串口输出相应的指示文字。
void setup()
{
Serial.begin(9600);
attachInterrupt(0, xieru, FALLING); //中断模式0,2号脚为信号脚,下降沿有效,运行xieru函数。
attachInterrupt(1, WEBduqu, FALLING); // 未启用
Serial.println("中断-OK");
Wire.begin(); //初始化IIC
Serial.println("IIC-OK");
RTC.begin(); //初始化实时时钟
Serial.println("RTC-OK");
server.begin();//初始化实时服务器
Serial.println("server-OK");
connectToInternet();//输出服务器信息函数
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
Serial.println("I/O-OK");
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect))
{
Serial.println("TF Card failed, or not present");
while (1);//无TF卡,则进入死循环
}
Serial.println("TF card initialized.");
DateTime now = RTC