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?
Rolety inaczej (433MHz)
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.
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.
-
- 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...
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
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.
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;
}
}
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ś?
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!
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!