|
本帖最后由 zcbzjx 于 2013-3-10 17:33 编辑
Microduino的模块开发初步告一个段落,目前想用这些模块做一些应用,好久没写代码了,很生疏了。
这次想做一个LED吸顶灯的应用,初步是子端通过Microduino-nRF24模块和-Core模块实现对10w左右的大功率LED网络控制,主板(命名为Light-Microduino)采用大功率LED的驱动芯片,PWM通过mos或者三极管扩流,对该驱动芯片进行调光控制,子端通过nRF24模块和网关进行通讯(接收网关的控制信号,上传子端的一些传感器信息比如LED铝基板的温度)。网关采用-nRF24模块和-ENC28J60模块及-Core+模块,-nRF24模块和子端进行通讯,-ENC28J60模块连接到家庭无线路由器。这样就可以通过手机或者PC访问网关实现对吸顶灯的控制。
恩,不用说,大家也知道,这儿把网关作为了一个web服务器。为了减少通讯数据量,只在页面刷新的时候,更新客户端浏览器的整个页面,控制信息通过jquery UI(感谢大Q的建设性意见和破砖的手把手指导,jquery确实很方便)后台post到服务器,服务器接收post数据包,解码控制信息再通过nrf24把控制信号传送给子端。
恩,目前主要完成了控制界面的生成,希望对各位想用enc28j60做web服务器的朋友有所帮助。
直接代码把,补充一句,图片和jquery UI需要的js css都外链了。
[pre lang="arduino" line="1" file="Light-Microduino"]#include <EtherCard.h>
#define RELAY_PIN 7
// ethernet interface mac address
static byte mymac[] = {
0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = {
192,168,1,8 };
// gateway ip address
static byte gwip[] = {
192,168,1,254 };
byte Ethernet::buffer[2000];
char* on = "ON";
char* off = "OFF";
char* imageLabel;
uint8_t brightness,lightStatus;
void setup () {
Serial.begin(57600);
Serial.println("Light Microduino");
if(!ether.begin(sizeof Ethernet::buffer, mymac))
Serial.println( "Failed to access Ethernet controller");
else
Serial.println("Ethernet controller initialized");
if(ether.staticSetup(myip, gwip)){
Serial.println("Set static IP ok!");
}
else{
Serial.println("Set static IP Failed!");
}
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
brightness = 255;
lightStatus = 0;
imageLabel = off;
}
void loop() {
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
if(pos) {
//Serial.println((char *)Ethernet::buffer + pos);
if(strstr((char *)Ethernet::buffer + pos, "OST") !=0) {
sscanf((char *)strstr((char *)Ethernet::buffer + pos, "brightness"),"brightness=%d&lightstatus=%d",&brightness,&lightStatus); //解码post数据包获取需要的控制信息,用sscanf()函数来得很方便。
Serial.print("brightness=");
Serial.println(brightness);
Serial.print("lightStatus=");
Serial.println(lightStatus);
if(lightStatus){
imageLabel=on;
}
else{
imageLabel=off;
}
}
if (lightStatus){
analogWrite(RELAY_PIN, brightness);
}
else{
digitalWrite(RELAY_PIN, LOW);
}
BufferFiller bfill = ether.tcpOffset();
bfill.emit_p(PSTR("HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n"
"ragma: no-cache\r\n\r\n"
"<!doctype html>"
"<html lang=\"en\">"
"<head><meta charset=\"utf-8\" /><meta name=\"viewport\" content=\"width=200px\"/>"
"<title>Light-Microduino</title>"
"<link rel=\"stylesheet\" href=\"http://code.jquery.com/ui/1.10.1/themes/base/jquery-ui.css\" />"
"<script src=\"http://code.jquery.com/jquery-1.9.1.js\"></script>"
"<script src=\"http://code.jquery.com/ui/1.10.1/jquery-ui.js\"></script>"
"<script>"
"$$(document).ready(function (){"
"var status=$D;"
"$$( \"#slider\" ).slider({"
"animate: \"fast\",value: $D,min: 0,max: 255,step: 5,"
"change: function( event, ui ) {"
"$$.post(\"\",{\"brightness\"$(\"#slider\").slider(\"value\"),\"lightstatus\":status});"
"}"
"});"
"$$(\"#button\").click(function(){"
"if(status==0){"
"$$(this).css(\"background\",\"url('http://test.microduino.net/ON.jpg')\");"
"status=1;"
"}else{"
"$$(this).css(\"background\",\"url('http://test.microduino.net/OFF.jpg')\");"
"status=0;"
"}"
"$$.post(\"\",{\"brightness\"$(\"#slider\").slider(\"value\"),\"lightstatus\":status});"
"});"
"});"
"</script>"
"</head><body style=\"background-color:black\";>"
"<div style=\"position:absolute;width:200px;height:200px;top:50%;left:50%;margin:-100px 0 0 -100px\">"
"<div style=\"font:bold 14px verdana;text-align:center\"><div id=\"slider\"></div><br/>"
"<br/><button type=\"button\" id=\"button\" style=\"background:url('http://test.microduino.net/$S.jpg');border-style:none;width:128px;height:128px;background-repeat:no-repeat;\"/>"
"</div></div></body></html>"),lightStatus,brightness,imageLabel);
ether.httpServerReply(bfill.position());
}
}[/code]
来个视频,连线很简单哈,叠加-core+模块、-enc28j60模块、-ft232模块 D7和GND分别连接到一个贴片LED的2端(我没led模块,做实验一般采用别的模块的pwr指示led,视频中采用的是-core模块的pwr指示led,很多同学说火机大哈,实际是模块小哈,hoho)。
还有很多工作要做。。下一步是把控制信息通过-nRF24模块 传送到子端,再下一步是大功率led驱动芯片的选型,再再下一步。。。。hoho
|
|