Continuação da "Smart Home" baseada no Arduino.Olá.Para uma melhor compreensão, recomendo a leitura da primeira parte .Esta parte descreve o controle suave da iluminação ( dimmer , a seguir PWM), bem como o armazenamento de valores na memória EEPROM não volátil.Salvar dados na memória possibilita retornar o sistema ao estado anterior após um blecaute.Aqui você pode ver e tocar em tempo real.O vídeo está anexadoipad.
Os botões habilitarão / desabilitarão os pinos correspondentes, e mover os controles deslizantes aumentará / diminuirá o PWM em D5 e D6.Dentro dos indicadores existem botões semicirculares com os quais você pode desativar e ativar instantaneamente o PWM. Quando ativado, o valor PWM que foi desativado será retornado.Eu vou direto ao ponto ...Arduino
Redefina primeiro a EEPROM. Preencha este esboço:#include <EEPROM.h>
void setup()
{
for (int i = 0; i < 512; i++)
EEPROM.write(i, 0);
digitalWrite(13, HIGH);
}
void loop()
{
}
Agora o programa principal:#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);
}
A troca de dados com o arduino é descrita aqui ou aqui .Como funcionam osbotões:Um botão (por exemplo, D13 ) acende o LED e grava a unidade na EEPROM. O sinalizador 1 será enviado para a interface da web indicando que o comando foi concluído. O botão acende.Quando pressionado novamente, o LED apaga e zero será gravado na EEPROM. O sinalizador 0 será enviado para a interface da web . O botão mudará de cor.Ou seja, na interface da web apenas o comando garantido será exibido....
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;
...
Se você ativar o D13 e desenergizar o arduin, na próxima vez em que ligar o arduin, ele lerá a célula de memória correspondente:...
byte d13 = EEPROM.read(13);
...
E se houver, no bloco de configuração vazia () o LED acenderá:...
delay(500);
if(d13) digitalWrite(13, HIGH); else digitalWrite(13, LOW);
É necessária uma pausa antes de ligar para que todos os consumidores NÃO liguem ao mesmo tempo (por exemplo, esta é uma casa de verão e aquecedores em salas diferentes são controlados pelo arduino).Para desabilitar o controle “automático”, por exemplo, para o pino d2 , é necessário redirecionar isso no início do código:...
byte d2 = EEPROM.read(2);
...
nisto:byte d2 = 0;
Na configuração nula (), remova as linhas:...
if(d2) digitalWrite(2, HIGH); else digitalWrite(2, LOW);
delay(500);
...
E no bloco do comutador (descritivo [3]), comente a entrada na EEPROM, assim:...
case 'A':
digitalWrite(2, HIGH);
d2 = 1;
glavnaia();
break;
case 'a':
digitalWrite(2, LOW);
d2 = 0;
glavnaia();
break;
...
Obscuro:O intervalo de valores PWM é de 0 a 255, o arduino recebe (do cliente) valores no intervalo de 0 a 100, que são multiplicados por 2,55 dentro do programa e exibidos no "pé".
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;
Se o controle deslizante se mover, o comando para aumentar / diminuir o PWM em um será enviado ao arduino (e assim por diante enquanto move o controle deslizante). Variável Shim1 ++; aumenta, seu valor é armazenado na memória e o calço1 multiplicado por 2,55 é alimentado ao pino.Depois disso, o valor de shim1 é enviado de volta à interface da web e atribuído ao indicador e controle deslizante.O indicador e o controle deslizante receberão o valor que é garantido para ser executado pelo arduino.Se parte dos dados for perdida, o controle deslizante se moverá para o lado.Quando você clica no botão dentro do indicador:O comando nulo shim1 será enviado ao arduino case 'F':
shim1 = EEPROM.read(5);
analogWrite(5, shim1 * 2.55);
glavnaia();
break;
case 'f':
shim1 = 0;
analogWrite(5, shim1);
glavnaia();
break;
Ao mesmo tempo, nada é gravado na memória e pressionar o próximo botão retornará o valor da memória.(é mais conveniente desligar a luz do que mudar o controle deslizante)Interface
Faça o download do arquivo morto e descompacte-o na pasta de trabalho do servidor (por padrão é / var / www), por exemplo - / var / www / knopki_shimpolz (você pode ter sua própria pasta).No navegador, vá para your_ router / knopki_shimpolz / . A seguinte imagem será exibida:Como funcionaÉ aconselhável abrir o arquivo index.html do arquivo e ler os comentários.Dimmer:No carregamento da primeira página, a função de atualização é ativada - show (); (no futuro, ele funciona com um intervalo definido) e os valores PWM são solicitados dos arduins junto com outros dados:
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();
...
Após receber o valor de shim1 , o programa entra na função 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();
}
O valor shim1 é exibido no indicador (círculo verde) e o trabalho é transferido para a função sl1 () ;Função sl1 (); define o controle deslizante de acordo com o valor shim1function sl1(){ /* */
$( "#slider" ).slider({
value : shim1,
min : 0,
max : 100,
step : 1,
slide: function( event, ui ) {
...
Slide de função : function (event, ui) espera que o controle deslizante se mova.Quando o controle deslizante é deslocado em uma direção ou outra por uma divisão, o seguinte algoritmo funcionará:Atualização desabilitada ⇨flagobnov = 0;
É verificado em qual direção o controle deslizante é movido (para cima ou para baixo))if( ui.value > shim1 ){
else if( ui.value < shim1 ){
Um símbolo é enviado ao Arduine indicando aumentar (diminuir) o PWM em um ⇨$.ajax({
type: "GET",
url: "box2.php?df=D",
Obtemos um novo valor PWM dos arduins e chama a função de renderização do indicador (sh1 ();) com o novo valor ⇨shim1 = vars[12];
sh1();
Ative a atualização ⇨flagobnov = 1;
A função ( sh1 (); ), por sua vez, desenha um indicador e transfere o controle para a função ( sl1 () ;).A função ( sl1 (); ) define o controle deslizante de acordo com o novo valor de PWM e espera o próximo movimento do controle deslizante.Código como um todo: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;
}
});
}
O valor do indicador e a posição do controle deslizante são garantidos para corresponder ao valor no arduino.Pressionar o botão “Desligar instantaneamente o PWM” envia o comando para redefinir o PWM para o arduino, e o botão “Ligar instantaneamente o PWM” solicitará ao arduino o valor do PWM que estava antes da redefinição.
$(".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;
});
Aparência
A posição dos indicadores, sua cor e fonte mudam no arquivo 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;
}
O tamanho e a posição dos controles deslizantes podem ser alterados no arquivo 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;
}
Isso é tudo: na próxima parte, consideraremos conectar sensores de temperatura e ligar / desligar vários dispositivos pela temperatura, além de adicionar o modo de suspensão à interface da web.Obrigado.