Модуль управления жалюзи по радио и ик каналу.

Показывайте и делитесь своими замечательными проектами здесь! Мы любим картинки!
Ответить
Sergey2055
Сообщения: 50
Зарегистрирован: 04 июл 2017, 13:43

Модуль управления жалюзи по радио и ик каналу.

Сообщение Sergey2055 »

Код: Выделить всё

#define MY_RADIO_NRF24
#define MY_NODE_ID 10
#include <MySensors.h>
#include <SPI.h>
#include <Servo.h> 
#include <IRremote.h>
#include <avr/wdt.h>

#define NODE_IDP 1
#define NODE_Time 4

int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
Servo myservo1;
Servo myservo2;

unsigned long TIME;
unsigned long interval = 1;
int P, S;
int K1 = 7;
int K2 = 8;

MyMessage msgP(NODE_IDP, V_STATUS);
MyMessage msgTime(NODE_Time, V_VAR2);



void presentation()
{
sendSketchInfo("jalousie sensor", "V1.0_03072017"); 

present(NODE_IDP, S_LIGHT, "jalousie status");
present(NODE_Time, S_CUSTOM, "Time sleep");
}

void setup(){
  wdt_disable(); 
  pinMode(K1, OUTPUT);
  pinMode(K2, OUTPUT);
  myservo1.attach(5);
  myservo2.attach(6);
  digitalWrite(RECV_PIN, HIGH);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  int L = loadState(3);
  if((L) > 0 && (L)< 255)
  interval=L*60000;
  irrecv.enableIRIn(); // Start the receiver
}

void loop()
{    
      if (irrecv.decode(&results)) {
        Serial.print("0x");
        Serial.println(results.value, HEX);
 if (results.value == (0x91EE7A85)) //Код кнопки
 {
 P=1;
 S=1;
 }
 if (results.value == (0x91EE906F)) //Код кнопки
 {
 P=0;
 S=1;
 }		
 irrecv.resume(); // Получаем следующее значение
   }

   if(P == 1)
    {
    myservo1.write(180);
    digitalWrite(K1, HIGH);
    delay(2000);    
    digitalWrite(K1, LOW);
    myservo2.write(0);
    delay(500);
    digitalWrite(K2, HIGH);
    delay(2000);    
    digitalWrite(K2, LOW);
    if(S == 1)
    send(msgP.set(P));  //value переменная 2-указываеьт сколько знаков после запятой выводить.
    P = 100;
    S = 0;
    send(msgTime.set((interval)/60000)); 
    }
    
    if(P == 0)
    {
    myservo1.write(0);
    digitalWrite(K1, HIGH);
    delay(2000);    
    digitalWrite(K1, LOW);
    myservo2.write(180);
    delay(500);
    digitalWrite(K2, HIGH);
    delay(2000);    
    digitalWrite(K2, LOW);
    if(S == 1)
    send(msgP.set(P));  //value переменная 2-указываеьт сколько знаков после запятой выводить.
    P = 100;
    S = 0;
    send(msgTime.set((interval)/60000)); 
    }
    

if((millis()-TIME) > interval)
{
TIME = millis();
send(msgTime.set((interval)/60000));  
}

}


//********************************************************

void receive(const MyMessage &message) {
  
    if (message.type==V_STATUS) { 
    P = message.getInt();   
   }
    
    if (message.type==V_VAR2) { 
      if((message.getInt())<255){
    saveState(3, message.getInt());
    interval = (loadState(3)*60000);
    send(msgTime.set((interval)/60000));
      }
   }   
}
Вот решил еще добавить схемку чтоб понятней было.
Вложения
IMG_20170704_184310.jpg
IMG_20170704_184310.jpg (81.26 КБ) 9177 просмотров
IMG_20170706_130022.jpg
IMG_20170706_130022.jpg (38.99 КБ) 9177 просмотров
IMG_20170704_104131.jpg
IMG_20170704_104131.jpg (108.13 КБ) 9181 просмотр
Ответить