O método de automação de cortina mais acessível



Não há como acompanhar o desenvolvimento de sistemas modernos de automação residencial de marcas eminentes, mas o preço e uma certa funcionalidade fazem com que você aplique suas habilidades a eletrodomésticos. Não fui exceção, a técnica e o trabalho com software agora estão mais acessíveis, ESC, Arduino, STM e outras infinitas plataformas propostas oferecem oportunidades para resolver praticamente qualquer problema técnico. Há pouco tempo, mudei-me para um novo apartamento nos arredores da cidade, um salão com vista para um terreno baldio e um canteiro de obras abandonado no qual os faisões caminhavam no inverno, tudo muda rapidamente e está sendo construído, uma casa cresceu fora da janela, uma janela pela janela.



A falta de desejo de se tornar objeto da atenção de outra pessoa estimulou a cortar cortinas automáticas. Então, o que eu queria das cortinas, a primeira, levantando e abaixando de acordo com o tempo definido, controle, inclusive via Internet, embora a segunda fosse necessária para a implementação do controle de voz. Como resultado, existem muitas coisas interessantes na Internet, mas como sou fraco em programação, não consegui entender muitas soluções, e nem todas elas atenderam aos requisitos. A decisão de fazê-lo por conta própria veio gradualmente, aqui eu gradualmente pisei em todos os ancinhos, mas ainda cheguei aos resultados. Compraram-se persianas, desmontou-se uma velha câmera giratória de CCTV retirada do objeto, e extraí dois motores de passo noone-chineses cujas características não consegui encontrar na Internet.



Tendo lidado com os motores, usei o nodemcu para controlá-los, que envia sinais para controlar a unidade de energia para o driver ln298n, um esboço simples funciona na plataforma Blynk, a posição inicial da cortina é contada a partir do sinal do interruptor reed, um certo número de etapas é levado para a posição inferior. O tempo de subir e descer varia em alguns segundos e é de um minuto e meio, bem devagar, mas sem som! A placa possui um módulo wi-fi embutido, e a plataforma pisca permite a sincronização com o tempo, dependendo do fuso horário, como resultado, um widget tornou possível simplificar o circuito o máximo possível. O controle de voz é realizado no assistente de Dusya, enquanto eu uso o telefone como plataforma, há alarmes falsos periódicos, não críticos, no futuro será possível substituir a plataforma (se eu descobrir) e substituir o microfone, existem idéias.





Alguns meses de operação se passaram, tudo funciona, não pulo as etapas, não presto mais atenção nas cortinas, o que você não pode dizer sobre o meu gato, elas causam interesse estável. Quais são as desvantagens, as cortinas não funcionam na ausência da Internet (pagamento para implementação acessível), não há feedback, até que eu percebi, não está claro em que posição as cortinas estão abertas ou fechadas. Embora não seja fatal se as cortinas estiverem abertas ou fechadas e não se controlar novamente, nada acontecerá. De qualquer forma, a implementação é justificada com base no preço de mercado em vigor. Bem, como se costuma dizer, tudo de bom!



Abaixo está o código para esp:

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h> //OTA   OTA-

#include <AccelStepper.h>
#define motor1 D1
#define motor2 D2
#define motor3 D3
#define motor4 D4
AccelStepper Stepper1(4, D1, D2, D3, D4); 

static int buttonPin = D5;  //     
//unsigned long runTime1; //     Arduino, 
unsigned long runTime2;
int current = 20800;// -    
static bool newZeroPoint = true; //  ,      ,    .

char auth[] = "";
char ssid[] = "";
char pass[] = "";
   

void setup() {
 Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  
  pinMode(buttonPin, INPUT);
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
  pinMode(motor3, OUTPUT);
  pinMode(motor4, OUTPUT);
  

  ArduinoOTA.setHostname("ESP8266-00002"); //OTA    
  //ArduinoOTA.setPassword((const char *)"0000"); //OTA      
  ArduinoOTA.begin(); //OTA  OTA
        
 Stepper1.setMaxSpeed(200);     //      (/)
Stepper1.setAcceleration(180); //  (/^2)
  
}
void ZeroPoint(){
  if (newZeroPoint)
  //   .
        if (digitalRead(buttonPin)) 
      {
          //   ,       .
          Stepper1.setCurrentPosition(0);
          newZeroPoint = false;
          //Serial.println("true");
      } else
      {
        //     ,       .
        if (Stepper1.distanceToGo() == 0) {Stepper1.moveTo(Stepper1.currentPosition() + 1000);}
        Stepper1.run();
        //Serial.println("false");
      }
  }
 BLYNK_WRITE(V0)
{
  int button = param.asInt(); // read button  
  if (button == 1){ Stepper1.move(-Stepper1.currentPosition());}  
}   
      
BLYNK_WRITE(V1)
{
  int button = param.asInt(); // read button  
  if (button == 1){
    
 Stepper1.moveTo(-current);
 Stepper1.run();
 } 
}
BLYNK_WRITE(V2)
{
  int button = param.asInt(); // read button  
  if (button == 1){
  Stepper1.stop();}
 } 
     
 void Out()//             
 {
  if (Stepper1.run())
  runTime2 = millis(); 
  if (millis() - runTime2 > 5000) 
  {runTime2 = millis();
  digitalWrite (5, LOW);
  digitalWrite (4, LOW);
  digitalWrite (0, LOW);
  digitalWrite (2, LOW);
    }
}
 void loop()
{
  Blynk.run();
 Stepper1.run();
    ZeroPoint(); 
    Out();
    ArduinoOTA.handle();       
   
}

All Articles