Rolety inaczej (433MHz)

Masz pomysł na funkcjonalność lub koncepcję na rozwój projektu. Opisz wszystko tutaj.
crazy4volvo
Posty: 2
Rejestracja: pn sie 01, 2016 11:17 pm

Witajcie,
chodzi mi po głowie koncept, którego samemu raczej nie dam rady oprogramować (wyrosłem na ZX Basic i wszelkie c, jawy itp to dla mnie magia).

Otóż mam w domu rolety dość chyba popularnego systemu Aluprof/Yooda sterowane pilotem RF. Protokół jest prosty: stały 40 bitowy kod, 28 bitów ID, 4 bity nr rolety i 2x 4 bity rozkaz góra, stop albo dół. Program na delayach puszczony na Arduino + nadajnik 433.92 MHz od majfrienda steruje roletami bez problemów.

Chciałbym uzyskać w Supli funkcje takie, jakie mają moje piloty: wybór 1 z 5 (istnieją piloty na 15, ja mam 5-kanałowego pilota i 5 rolet) albo wszystkich rolet naraz, 3 rozkazy: dół i góra (roleta jedzie sama do krańcówki) oraz stop. Pozycji rolety raczej nie da się pokazać - założeniem jest, aby nie wpinać się w już zainstalowane i objęte gwarancją urządzenia, za to postawić 1 bramkę WiFi/RF i mieć problem z głowy (teoretycznie można by było poprzez nasłuch radiowy oryginalnych pilotów i analizę czasów ruchu określać przybliżone położenie, ale to raczej zboczenie ;).

Aktualne rozwiązanie sterowania roletami w Supli średnio mi odpowiada - na moim poziomie mógłbym jedynie postawić 5 ESP8266, 5 Arduino i 5 nadajników (ok, może 1 Arduino i 1 nadajnik), poza tym przyciski w aplikacji działają chwilowo i obsługują tylko dwa rozkazy.
Myślę, że całość spokojnie mogłaby zmieścić się w pojedynczym ESP01 - ostatecznie przecież potrzebny jest tylko 1 bit do nadajnika.
Co Wy na to?
Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Jak masz już program na Arduino to wystarczy go spiąć z biblioteką dla Supli. W oprogramowaniu przewiduję dodatkowe rozkazy.
Przytrzymanie przycisku przez 2sek. rozpocznie całkowite zamykanie. Kolejne dotknięcie zatrzyma zamykanie. Z otwieraniem to samo.
Podeślij ten soft co masz do Arduino.
crazy4volvo
Posty: 2
Rejestracja: pn sie 01, 2016 11:17 pm

Załączam mój prostacki program machający roletą. ID pilota jest wyzerowane - rzeczywiste ID podeślę na PM.
Tak myślę, czy dałoby się w hipotetyczy uniwesalny firmware dla ESP01 lokalnie wprowadzać dane konfiguracyjne, np poprzez wgranie małego bloku pamięci? Może wyszłaby z tego fajna wielokanałowa uniwersalna bramka do RF/IR?
Edit: ech, przecież jest tryb konfiguracji przez www...
Załączniki
roleta_pub.zip
(1 KiB) Pobrany 278 razy
Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Dzisiaj miałem chwilę aby coś napisać na Arduino na podstawie Twojego programu.
Działa tak. Dotknięcie "Odsłoń" otwiera roletę przez 30 sek. Kolejne dotknięcie zatrzymuje otwieranie. To samo z zamykaniem.
Nie znam dokładnie zasady działania tego sprzętu i nie testowałem tego w praktyce.

Kod: Zaznacz cały

#include <SPI.h>
#include <Ethernet.h>
#include <SuplaDevice.h>

/*
 * SUPLA DEVICE - ARDUINO - ETHERNET SHIELD
 * Author: Przemyslaw Zygmunt <przemek@supla.org>
 *
 */

 typedef struct {

   int channelNumber;
   byte rs_id;
   char cmd;  // 0 - none, 1 - up, 2 - down, 3 - stop
   uint8_t last_val;
   int ms;
   unsigned long last_time;
    
  
}RollerShutter;

#define CMD_ID  0b0001;
#define CMD_ADDR1 0b1000;

#define CMD_UP     0b10001000
#define CMD_DOWN   0b11001100
#define CMD_STOP   0b10101010
#define CMD_ID     0b0000000000000000000000000000

#define UP_TIME_MS    30000
#define DOWN_TIME_MS  30000
#define STOP_TIME_MS  1000

#define RS_COUNT 1

int ask433_Pin = 51;

RollerShutter RS[RS_COUNT];

void ask433_sync()
{ 
    delay(10);
    digitalWrite(ask433_Pin, HIGH);   
    delayMicroseconds(4760);         
    digitalWrite(ask433_Pin, LOW);   
    delayMicroseconds(1520);       
}

void ask433_cmd(unsigned int cmd, byte bit_count) {

    for(int a=0;a<bit_count;a++) {

         if ( cmd & 1 ) {
          
            digitalWrite(ask433_Pin, HIGH);   
            delayMicroseconds(720);         
            digitalWrite(ask433_Pin, LOW);   
            delayMicroseconds(360);    

            //Serial.println("1");
  
         } else {
          
            digitalWrite(ask433_Pin, HIGH);   
            delayMicroseconds(320);         
            digitalWrite(ask433_Pin, LOW);   
            delayMicroseconds(760);  

            //Serial.println("0");
  
         }

         cmd=cmd>>1;
      
    }
    
}

void ask433_id() {
     ask433_sync();
     ask433_cmd(CMD_ID, 28); 
}

void ask433_rs_id(byte id) {

     ask433_cmd(id & 0x8, 1);
     ask433_cmd(id & 0x4, 1);
     ask433_cmd(id & 0x2, 1);
     ask433_cmd(id & 0x1, 1);
}

void ask433_up(byte rs_id) {
  
     ask433_id();
     ask433_rs_id(rs_id);
     ask433_cmd(CMD_UP, 8);
   
     //Serial.println("UP");
}


void ask433_down(byte rs_id) {
  
     ask433_id();
     ask433_rs_id(rs_id);
     ask433_cmd(CMD_DOWN, 8); 
     
     //Serial.println("DOWN");
}

void ask433_stop(byte rs_id) {
  
     ask433_id();
     ask433_rs_id(rs_id);
     ask433_cmd(CMD_STOP, 8); 
     

     //Serial.println("STOP");
}

void suplaDigitalWrite(int channelNumber, uint8_t pin, uint8_t val) {

      if ( val != 1 ) return;

      val = pin;

      for(int a=0;a<RS_COUNT;a++)
        if ( RS[a].channelNumber == channelNumber ) {

            if ( val == RS[a].last_val ) {

               RS[a].cmd = 3;
               RS[a].ms = STOP_TIME_MS;
              
            } else if ( val == 1 )  {

               RS[a].cmd = 2;
               RS[a].last_val = val;
               RS[a].ms = UP_TIME_MS;
               
            } else  {

               RS[a].cmd = 1;
               RS[a].last_val = val;
               RS[a].ms = DOWN_TIME_MS;
               
            }

            RS[a].last_time = millis();

            break;
        }

}

void setup() {

  SuplaDevice.setDigitalWriteFuncImpl(&suplaDigitalWrite);
  Serial.begin(9600);

  RS[0].channelNumber = 0;
  RS[0].rs_id = 1;

  
  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid


  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};


  for(int a=0;a<RS_COUNT;a++) {
      RS[a].last_val = 255;
      RS[a].cmd = 0;

      SuplaDevice.addRollerShutterRelays(1, 2);    
  }
  

  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr1.supla.org",  // SUPLA server address
                    0,                // Location ID 
                    "");           // Location Password
    
}

void loop() {
 
    SuplaDevice.iterate();

    for(int a=0;a<RS_COUNT;a++)
      if ( RS[a].cmd ) {

          switch(RS[a].cmd) {
            case 1:
            ask433_up(RS[a].rs_id);
            break;
            case 2:
            ask433_down(RS[a].rs_id);
            break;
            case 3:
            ask433_stop(RS[a].rs_id);
            break;
          };

          unsigned long t = millis();
          unsigned long n = t - RS[a].last_time;

          if ( n >= RS[a].ms ) {

            RS[a].ms = 0;
            RS[a].cmd = 0;
            RS[a].last_val = 255;
            
          } else {
            RS[a].ms-=n;
          }
          
          RS[a].last_time = t;
      }
 
}
malirth
Posty: 20
Rejestracja: śr cze 29, 2016 9:47 am

I co program przetestowany może?
Tak się składa, że mam rolety tego samego typu i pytanko do autora jaki dokładnie nadajnik zastosowałeś?
Minister Zdrowia i Opieki Psychiatrycznej OSTRZEGA!
Przed użyciem zapoznaj się z instrukcją lub skonsultuj z elektronikiem lub programistą, gdyż każdy układ niewłaściwie stosowany może zagrażać twojemu życiu lub zdrowiu!
andras
Posty: 463
Rejestracja: pt gru 30, 2016 5:51 pm

malirth pisze: wt sty 10, 2017 2:31 pm I co program przetestowany może?
Tak się składa, że mam rolety tego samego typu i pytanko do autora jaki dokładnie nadajnik zastosowałeś?
Witam

Też przyłączam się do tego pytania .
ODPOWIEDZ

Wróć do „Pomysły i koncepcje”