【翻译教程】enc28J60 和 Arduino (14)——获取数据存储到服务器并显示图表
终于等到原作者出第14篇教程了,我又可以来挣极客工坊淘宝杂货铺的¥5元的消费劵了,很多人还不知道吧,这儿帮极客工坊论坛宣传下吧,发表高质量文章就有可能获取金币的哦,而这个金币就可以在极客工坊的淘宝杂货铺当钱用哦,1金币=¥1元。hoho,看看你们有多少金币吧。好了,言归正传,原文在这儿,英文好的帮我校正下。。。多谢!
在本教程中,我将介绍如何开发一个小网站从Arduino的(使用Enc28j60盾)获取数据,存储并显示出图标曲线。
逻辑架构
您的网站将会由两页:
saveTemp.php,从Arduino获取数据,并将其存储在文本文件;displayTemp.php,读取文本文件,并显示数据。
2013-5-13 19:04 上传
(17.97 KB)
在这个例子中,Arduino使用SD18B20传感器获取房间的温度,我已经在博客的这篇文章介绍了该传感器。
对于网页编程,我选择了在网络上广泛使用PHP。
注意:为了保持简单的例子,数据被存储在一个CSV(逗号分隔值)文件,在实际应用中,最好使用一个数据库,例如MySQL。
发送数据
我使用的HTTP协议的GET方法将数据发送到Web服务器。这种方法请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.php?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
2013-5-13 19:04 上传
(11.56 KB)
为了防止其他用户发送数据,除了温度参数,你也必须发送到该网页的密码,使用pwd参数。
我的代码读取温度传感器,将其转换成字符串类型,并把它“print”到一个Stash对象:sensors.requestTemperatures();
float float_temp = sensors.getTempCByIndex(0);
char string_temp[7];
dtostrf(float_temp, 4, 2, string_temp);
Stash stash;
byte sd = stash.create();
stash.print(string_temp);
stash.save();复制代码然后在另外一个Stash对象中准备请求(Http Get 请求),并用tcpSend()方法发送到服务器:Stash::prepare(PSTR("GET /demo/saveTemp.php?temp=$H&pwd=$F HTTP/1.0" "\r\n"
"Host: $F" "\r\n" "\r\n"),
sd, password, website);
session_id = ether.tcpSend();复制代码由于会话标识符(SESSION_ID),你可以得到一个来自服务器的响应,并检查它是否包含错误消息(“KO”):const char* reply = ether.tcpReply(session_id);
[...]
if(strstr(reply, "KO - ") != 0) Serial.println(strstr(reply, "KO - "));复制代码在PHP中,你可以通过关联数组$_GET获得这些HTTP GET发送过来的数据:$temp = $_GET["temp"];
$pwd = $_GET["pwd"];复制代码验证密码后,温度值以及对应的时间戳一起存储在文件中:define("LOG_FILE", "./temperatures.csv");
[...]
$file_handler = fopen(LOG_FILE, "a+");
fwrite($file_handler, time() . "," . $temp . "\n");复制代码旁白请忽略,版主如果觉得不合适可以删除:哎要不要给我的维基拉点流量嘞。。。算了,还是让各位看官直接在这儿爽完吧。。。因为我饱受那样的痛苦。。。从此直接忽略掉这类文章。。。
数据显示
为了使这个例子更有趣,我决定把这些数据显示在图表上。
对于PHP,有一个很好的开源的图表库可供选择:JpGraph。要使用它,你必须把库文件上传到您的网站的子文件夹中,通常为“/JpGraph”:
2013-5-13 19:04 上传
(14.83 KB)
在PHP代码中,你就必须包括需要的库,这取决于你要创建的图表类型:require_once('jpgraph/jpgraph.php');
require_once('jpgraph/jpgraph_line.php');
复制代码JpGraph库不负责获取图表所需的数据而是通过PHP代码,打开文件 - 按行 - 把数据保存到两个数组中:$file_lines = file(LOG_FILE, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
foreach($file_lines as $line_num => $line_value) {
$line_elements = explode(",", $line_value);
$times[] = date("H:i:s", $line_elements[
2013-5-13 19:04 上传
(18.09 KB)
2013-5-13 19:04 上传
(11.76 KB)
翻译结束!
下面是我的验证过程:
软件准备
1.php服务站点,托破砖的福。。帮我建了一个——demo.microduino.net;
2.下载JpGraph库,下载地址在这儿;
为保持完整也可直接从下面下载
jpgraph-1.27.1.tar.gz
(4.45 MB, 下载次数: 41)
2013-5-13 20:27 上传
点击文件名下载附件
阅读权限: 20
3.解压缩后,将文件夹内的old文件夹更名为JpGraph,并上传到demo.microduino.net对应的根目录下;
4.下载例程所需文件,下载地址在这儿;
也可直接从这儿下载
_14_WebTemperature.zip
(2.18 KB, 下载次数: 45)
2013-5-13 20:38 上传
点击文件名下载附件
阅读权限: 20
5.将displayTemp.php,saveTemp.php 2个文件拷贝到demo.microduino.net对应的根目录下;
可以更改saveTemp.php中的password。define("PASSWORD", "password");复制代码比如可更改为:define("PASSWORD", "xxxxxxx");复制代码硬件准备
1.microduino-core(也可用uno 或者nano);
2.Microduino-FT232R(如果用uno或者nano就不用这个了);
3.Microduino-ENC28J60和-RJ45(也可用别的ENC28J60盾或者模块);
4.Test-Microduino;
5.自制的18B20温度传感器(当然你也可以用现成的18B20温度传感器模块)。
开始试验
各个模块叠加,并插入Test-Microduino实验底板,并在底板上连接传感器:
2013-5-13 19:04 上传
(220.72 KB)
恩,大家可以看到ENC28J60模块的片选是连接到D8,温度传感器模块数据端口是连接到A0的。
恩,如果用别的模块的请注意连线别连接错了哦。
我先休息10分钟,等大家连线,抽根烟,泡杯茶。。。。。
恩,大家连好了吧,我们继续:
插入网线和usb线:
2013-5-13 19:04 上传
(272.08 KB)
下载代码:
ARDUINO 代码复制打印下载
#include <EtherCard.h>#include <OneWire.h>#include <DallasTemperature.h>#define SEND_INTERVAL5000#define TIMEOUT 5000#define ONE_WIRE_BUS A0#define STATUS_IDLE 0#define STATUS_SENT 1// ethernet interface mac addressstatic byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };// ethernet interface ip addressstatic byte myip[] = { 10,21,0,195 };// gateway ip addressstatic byte gwip[] = { 10,21,0,1 };// dns ip addressstatic byte mydns[] = { 10,11,5,25 };byte Ethernet::buffer[700];char website[] PROGMEM = "demo.microduino.net";char password[] PROGMEM = "xxxxxxxx";OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);unsigned long previousMillis = 0;static byte session_id;byte actual_status;void setup () {Serial.begin(57600);Serial.println("WebTemperature demo");Serial.println();if (!ether.begin(sizeof Ethernet::buffer, mymac)) { Serial.println( "Failed to access Ethernet controller"); while(1); } else Serial.println("Ethernet controller initialized");if (!ether.staticSetup(myip, gwip,mydns)) { Serial.println("Failed to get configuration from DHCP"); while(1);} else Serial.println("DHCP configuration done"); if (!ether.dnsLookup(website)) { Serial.print("Unable to resolve Website IP"); while(1);} else Serial.println("Website IP resolved");Serial.println();ether.printIp("IP Address:\t", ether.myip);ether.printIp("Netmask:\t", ether.mymask);ether.printIp("Gateway:\t", ether.gwip);ether.printIp("Website IP:\t", ether.hisip);Serial.println();}void loop() {ether.packetLoop(ether.packetReceive());unsigned long currentMillis = millis();switch(actual_status) { case STATUS_IDLE: if(currentMillis - previousMillis > SEND_INTERVAL) { previousMillis = currentMillis; sendTemperature(); } break; case STATUS_SENT: if(currentMillis - previousMillis > TIMEOUT) { Serial.println("No response"); previousMillis = currentMillis; actual_status = STATUS_IDLE; } checkResponse();}} void sendTemperature() {sensors.requestTemperatures();float float_temp = sensors.getTempCByIndex(
上传后,成功显示曲线。
你们的成功了么?什么?还在接线啊。。。
返回目录
via - 极客工坊