基于Arduino的“智能家居”的延续。你好。为了更好地理解,我建议阅读第一部分。这部分描述了照明的平滑控制(调光器,以下称为PWM),以及将值存储在非易失性EEPROM存储器中。将数据保存到内存可以使系统在停电后恢复到先前的状态。在这里您可以实时查看和触摸。这些按钮将启用/禁用相应的引脚,并且移动滑块将增加/减少D5和D6上的PWM。指示器内部是半圆形按钮,您可以使用它们立即禁用和启用PWM。打开时,将返回关闭时的PWM值。我会讲到重点...Arduino的
首先重置EEPROM。填写此草图:#include <EEPROM.h>
void setup()
{
for (int i = 0; i < 512; i++)
EEPROM.write(i, 0);
digitalWrite(13, HIGH);
}
void loop()
{
}
现在的主程序:#include <EEPROM.h>
byte d2 = EEPROM.read(2);
byte d3 = EEPROM.read(3);
byte d4 = EEPROM.read(4);
int shim1 = EEPROM.read(5);
int shim2 = EEPROM.read(6);
byte d11 = EEPROM.read(11);
byte d12 = EEPROM.read(12);
byte d13 = EEPROM.read(13);
byte descript[5];
void setup()
{
Serial.begin(57600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
if(d2) digitalWrite(2, HIGH); else digitalWrite(2, LOW);
delay(500);
if(d3) digitalWrite(3, HIGH); else digitalWrite(3, LOW);
delay(500);
if(d4) digitalWrite(4, HIGH); else digitalWrite(4, LOW);
delay(500);
analogWrite(5, shim1 * 2.55);
delay(500);
analogWrite(6, shim2 * 2.55);
delay(500);
if(d11) digitalWrite(11, HIGH); else digitalWrite(11, LOW);
delay(500);
if(d12) digitalWrite(12, HIGH); else digitalWrite(12, LOW);
delay(500);
if(d13) digitalWrite(13, HIGH); else digitalWrite(13, LOW);
}
void loop()
{
if (Serial.available()>4)
{
if (Serial.read()=='Y')
{
for (byte i=0; i < 5; i++)
{
descript[i] = Serial.read();
}
if((descript[0] =='+') && (descript[1] =='=') && (descript[2] =='Z'))
{
switch (descript[3])
{
case 'o':
glavnaia();
break;
case 'A':
digitalWrite(2, HIGH);
d2 = 1;
EEPROM.write(2, d2);
glavnaia();
break;
case 'a':
digitalWrite(2, LOW);
d2 = 0;
EEPROM.write(2, d2);
glavnaia();
break;
case 'B':
digitalWrite(3, HIGH);
d3 = 1;
EEPROM.write(3, d3);
glavnaia();
break;
case 'b':
digitalWrite(3, LOW);
d3 = 0;
EEPROM.write(3, d3);
glavnaia();
break;
case 'C':
digitalWrite(4, HIGH);
d4 = 1;
EEPROM.write(4, d4);
glavnaia();
break;
case 'c':
digitalWrite(4, LOW);
d4 = 0;
EEPROM.write(4, d4);
glavnaia();
break;
case 'D':
shim1++;
if(shim1 > 100) shim1 = 100;
EEPROM.write(5, shim1);
analogWrite(5, shim1 * 2.55);
glavnaia();
break;
case 'd':
shim1--;
if(shim1 < 1) shim1 = 0;
EEPROM.write(5, shim1);
analogWrite(5, shim1 * 2.55);
glavnaia();
break;
case 'E':
shim2++;
if(shim2 > 100) shim2 = 100;
EEPROM.write(6, shim2);
analogWrite(6, shim2 * 2.55);
glavnaia();
break;
case 'e':
shim2--;
if(shim2 < 1) shim2 = 0;
EEPROM.write(6, shim2);
analogWrite(6, shim2 * 2.55);
glavnaia();
break;
case 'F':
shim1 = EEPROM.read(5);
analogWrite(5, shim1 * 2.55);
glavnaia();
break;
case 'f':
shim1 = 0;
analogWrite(5, shim1);
glavnaia();
break;
case 'G':
shim2 = EEPROM.read(6);
analogWrite(6, shim2 * 2.55);
glavnaia();
break;
case 'g':
shim2 = 0;
analogWrite(6, shim2);
glavnaia();
break;
case 'J':
digitalWrite(11, HIGH);
d11 = 1;
EEPROM.write(11, d11);
glavnaia();
break;
case 'j':
digitalWrite(11, LOW);
d11 = 0;
EEPROM.write(11, d11);
glavnaia();
break;
case 'K':
digitalWrite(12, HIGH);
d12 = 1;
EEPROM.write(12, d12);
glavnaia();
break;
case 'k':
digitalWrite(12, LOW);
d12 = 0;
EEPROM.write(12, d12);
glavnaia();
break;
case 'M':
digitalWrite(13, HIGH);
d13 = 1;
EEPROM.write(13, d13);
glavnaia();
break;
case 'm':
digitalWrite(13, LOW);
d13 = 0;
EEPROM.write(13, d13);
glavnaia();
break;
default:
glavnaia();
}
}
else
{
for(byte i=0; i < 255; i++)
{
Serial.read();
}
}
}
}
}
void glavnaia()
{
Serial.print(d2);
Serial.print(",");
Serial.print(d3);
Serial.print(",");
Serial.print(d4);
Serial.print(",");
Serial.print(0);
Serial.print(",");
Serial.print(0);
Serial.print(",");
Serial.print(0);
Serial.print(",");
Serial.print(0);
Serial.print(",");
Serial.print(0);
Serial.print(",");
Serial.print(0);
Serial.print(",");
Serial.print(d11);
Serial.print(",");
Serial.print(d12);
Serial.print(",");
Serial.print(d13);
Serial.print(",");
Serial.print(shim1);
Serial.print(",");
Serial.println(shim2);
}
在此处或此处
介绍与arduino的数据交换。按钮的工作方式:一个按钮(例如D13)将打开LED并将单元写入EEPROM。标志1将发送到Web界面,指示命令已完成。该按钮点亮。再按一次,LED将熄灭,并且将零写入EEPROM。标志0将被发送到Web界面。该按钮将改变颜色。也就是说,在Web界面中,只会显示保证的命令。...
case 'M':
digitalWrite(13, HIGH);
d13 = 1;
EEPROM.write(13, d13);
glavnaia();
break;
case 'm':
digitalWrite(13, LOW);
d13 = 0;
EEPROM.write(13, d13);
glavnaia();
break;
...
如果打开D13并关闭arduin的电源,则下次打开arduin时,它将读取相应的存储单元:...
byte d13 = EEPROM.read(13);
...
如果有一个,则在void setup()块中,LED将打开:...
delay(500);
if(d13) digitalWrite(13, HIGH); else digitalWrite(13, LOW);
必须在开机前先停顿一下,以免所有消费者都不能同时开机(例如,这是一个夏季小屋,并且不同房间的加热器由arduino控制)。要禁用“自动”控制(例如对于引脚d2),您需要在代码开头将其重定向:...
byte d2 = EEPROM.read(2);
...
在此:byte d2 = 0;
在void setup()中,删除以下行:...
if(d2) digitalWrite(2, HIGH); else digitalWrite(2, LOW);
delay(500);
...
然后在开关块(描述[3])中注释掉EEPROM中的条目,如下所示:...
case 'A':
digitalWrite(2, HIGH);
d2 = 1;
glavnaia();
break;
case 'a':
digitalWrite(2, LOW);
d2 = 0;
glavnaia();
break;
...
调光器:PWM值的范围是0到255,arduino接收(从客户端)在0到100范围内的值,这些值在程序内部乘以2.55并显示在``脚''上。
case 'D': // d5 shim1
shim1++; //
if(shim1 > 100) shim1 = 100; // ,
EEPROM.write(5, shim1); //
analogWrite(5, shim1 * 2.55); //
glavnaia(); //
break;
case 'd': // d5 shim1
shim1--;
if(shim1 < 1) shim1 = 0;
EEPROM.write(5, shim1);
analogWrite(5, shim1 * 2.55);
glavnaia();
break;
如果滑块移动,则将PWM增大/减小1的命令将发送到arduino(以此类推,移动滑块时依此类推)。Shim1 ++变量;shim1乘以2.55,则其值将存储在存储器中,并被送入该引脚。之后,shim1的值将发送回Web界面并分配给指示器和滑块。指示器和滑块将被分配由arduino保证执行的值。如果部分数据丢失,则滑块将移到一边。当您单击指示器内的按钮时:清零命令shim1将发送到arduino case 'F':
shim1 = EEPROM.read(5);
analogWrite(5, shim1 * 2.55);
glavnaia();
break;
case 'f':
shim1 = 0;
analogWrite(5, shim1);
glavnaia();
break;
同时,没有任何内容写入存储器,按下一步按钮将从存储器返回值。(关闭灯光比移动滑块更方便)接口
下载存档并将其解压缩到服务器的工作文件夹(默认情况下为/ var / www),例如-/ var / www / knopki_shimpolz(您可能拥有自己的文件夹)。在浏览器中,转到your_ router / knopki_shimpolz /。将显示以下图片:工作原理建议从档案中打开index.html文件,然后阅读注释。调光器:在第一页加载时,更新功能被激活-show(); (将来,它以设定的间隔工作)并且从arduins请求PWM值以及其他数据:
show();
setInterval(show,2000);
function show(){
if(flagobnov == 1) {
$.ajax({
type: "GET",
url: "box2.php?df=o",
timeout:200,
cache: false,
success: function(data){
var vars = data.split(",");
if(vars.length == dlina){
if(vars[0] == 1) { $(".d2otkl").show(); $(".d2vkl").hide(); }
else if(vars[0] == 0) { $(".d2otkl").hide(); $(".d2vkl").show(); }
if(vars[1] == 1) { $(".d3otkl").show(); $(".d3vkl").hide(); }
else if(vars[1] == 0) { $(".d3otkl").hide(); $(".d3vkl").show(); }
...
shim1 = vars[12];
sh1();
shim2 = vars[13];
sh2();
...
收到shim1的值后,程序进入函数sh1();。function sh1(){
var $ppc = $('.progress-pie-chart'),
percent = shim1,
deg = 360*percent/100;
if (percent > 50) {
$ppc.addClass('gt-50');
}
else $ppc.removeClass('gt-50');
$('.ppc-progress-fill').css('transform','rotate('+ deg +'deg)');
$('.ppc-percents span').html(percent+' % D5 ');
sl1();
}
值shim1被显示在指示器(绿色圆圈)和工件被转移到功能SL1() ;函数sl1(); 根据shim1值设置滑块function sl1(){ /* */
$( "#slider" ).slider({
value : shim1,
min : 0,
max : 100,
step : 1,
slide: function( event, ui ) {
...
函数幻灯片:函数(事件,用户界面)期望滑块移动。当滑块沿一个方向或另一个方向移动一格时,以下算法将起作用:禁用更新⇨flagobnov = 0;
检查滑块向哪个方向移动(向上或向下))if( ui.value > shim1 ){
else if( ui.value < shim1 ){
向Arduine发送一个符号,指示将PWM增加(减少)一个⇨$.ajax({
type: "GET",
url: "box2.php?df=D",
我们从arduins中获得一个新的PWM值,并使用新值⇨调用指标呈现函数(sh1();)shim1 = vars[12];
sh1();
打开更新⇨flagobnov = 1;
函数(sh1();)依次绘制指示器并将控制权转移给函数(sl1() ;)。函数(sl1();)根据新的PWM值设置滑块,并期望下一个滑块运动。整体代码:function sh1(){
var $ppc = $('.progress-pie-chart'),
percent = shim1,
deg = 360*percent/100;
if (percent > 50) {
$ppc.addClass('gt-50');
}
else $ppc.removeClass('gt-50');
$('.ppc-progress-fill').css('transform','rotate('+ deg +'deg)');
$('.ppc-percents span').html(percent+' % D5 ');
sl1();
}
function sl1(){
$( "#slider" ).slider({
value : shim1,
min : 0,
max : 100,
step : 1,
slide: function( event, ui ) {
flagobnov = 0;
if( ui.value > shim1 ){
$.ajax({
type: "GET",
url: "box2.php?df=D",
timeout:200,
cache: false,
success: function(data){
var vars = data.split(",");
if(vars.length == dlina)
{
shim1 = vars[12];
sh1();
}
}
});
}
else if( ui.value < shim1 ){
$.ajax({
type: "GET",
url: "box2.php?df=d",
timeout:200,
cache: false,
success: function(data){
var vars = data.split(",");
if(vars.length == dlina)
{
shim1 = vars[12];
sh1();
}
}
});
}
flagobnov = 1;
}
});
}
指示器的值和滑块的位置保证与arduino中的值相对应。按下按钮“立即关闭PWM”发送命令以将PWM重置为arduino,按钮“立即开启PWM”将向arduino询问重置之前的PWM值。
$(".d5shimvkl").click(function(){
$.ajax({
type: "GET",
url: "box2.php?df=F",
timeout:200,
cache: false,
success: function(data)
{
var vars = data.split(",");
if(vars.length == dlina)
{
shim1 = vars[12];
sh1();
}
}
});
return false;
});
$(".d5shimotkl").click(function(){
$.ajax({
type: "GET",
url: "box2.php?df=f",
timeout:200,
cache: false,
success: function(data)
{
var vars = data.split(",");
if(vars.length == dlina)
{
shim1 = vars[12];
sh1();
}
}
});
return false;
});
出现
指示器的位置,其颜色和字体在shim.css文件中更改
.progress-pie-chart {
width: 200px;
height: 200px;
top: 90px;
left: 80px;
border-radius: 50%;
background-color: #E5E5E5;
position: absolute;
}
...
.ppc-percents span {
display: block;
font-size: 26px;
font-weight: 600;
font-family: Arial, Helvetica, sans-serif;
color: #161616;
text-shadow: 0px 1px 2px #7c7c7c;
}
可以在slai.css文件中更改滑块的大小和位置.ui-slider {
position: relative;
width: 200px;
text-align: left;
outline: none;
}
...
.ui-slider-horizontal .ui-slider-handle {
width: 50px;
height: 50px;
margin-left: -25px;
outline: none;
box-shadow: 0 0 10px 3px rgba(0,0,0,0.3);
border-radius: 4px;
border: 1px solid #2b2c2b;
cursor: pointer;
}
...
s1 {
position: absolute;
top: 360px;
left: 80px;
font-size: 26px;
font-weight: 600;
font-family: Arial, Helvetica, sans-serif;
color: #161616;
text-shadow: 0px 1px 2px #7c7c7c;
}
s2 {
position: absolute;
top: 360px;
left: 420px;
font-size: 26px;
font-weight: 600;
font-family: Arial, Helvetica, sans-serif;
color: #161616;
text-shadow: 0px 1px 2px #7c7c7c;
}
就是这样,在下一部分中,我们将考虑连接温度传感器并按温度打开/关闭各种设备,并为Web界面添加睡眠模式。谢谢。