最实惠的窗帘自动化方法



没有办法跟上知名品牌的现代家庭自动化系统的发展,但是价格和某些功能使您可以将技能应用到家用电器上。我也不例外,现在可以更轻松地使用技术和软件,ESC,Arduino,STM和其他不计其数的拟议平台为解决几乎所有技术问题提供了机会。不久前,我搬到了城市郊区的一间新公寓,一个俯瞰着空地的大厅和一个an鸡在冬天走过的废弃建筑工地,一切都在迅速变化并正在建造中,一所房子在窗户外生长,一扇窗户透过窗户。



缺乏成为别人关注的对象的欲望促使人们割开自动窗帘。因此,我希望从窗帘开始,首先是根据设定的时间进行升降,包括通过互联网进行控制,尽管后者对于实现语音控制是必需的。结果,Internet上有很多有趣的东西,但是由于我的编程能力很弱,所以我无法理解许多解决方案,并且并非所有解决方案都满足要求。我自己决定做的是逐渐的,在这里我逐渐踩到了所有耙子,但仍然得出了结果。购买了卷帘,拆除了从该物体上取下来的一台老式旋转CCTV摄像机,从中取出了两台Noone-Chinese步进电机,这些电机在互联网上找不到。



处理完引擎后,我使用nodemcu对其进行控制,然后将信号发送到ln298n驱动器以控制动力单元,在Blynk平台上进行了简单的绘制,从簧片开关的信号中计算出窗帘的初始位置,并在较低位置采取了一些步骤。上升和下降的时间相差几秒钟,只有一分半钟,很慢,但是没有声音!该开发板具有内置的wifi模块,并且眨眼平台允许根据时间进行时间同步,具体取决于时区,因此,一个小部件可以尽可能简化电路。语音控制是在Dusya的助手上执行的,当我使用电话作为平台时,会出现周期性的误报,这并不是很严重,将来有可能更换平台(如果我确定了)并更换麦克风,这是有想法的。





几个月的手术过去了,一切正常,不再跳过任何步骤,我不再关注窗帘了,你不能说我的猫,它们引起了他的兴趣。缺点是什么,在没有互联网的情况下,窗帘无法工作(支付得起的实施费用),没有反馈,直到我意识到这一点,尚不清楚窗帘在什么位置打开或关闭。虽然打开或关闭窗帘并重新提交命令并不致命,但是什么也不会发生。无论如何,根据当时的市场价格来证明实施是合理的。好吧,正如他们所说,一切都很好!



以下是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