Arduino Rolety przycisk na ścianie

emil_seba
Posty: 16
Rejestracja: wt kwie 24, 2018 6:21 am

Cześć,
Uruchomiłem przykład ( z github) sterownia roletami na Arduino Mega . Sterowanie z poziomu aplikacji działa ok, ale mam taką zagwozdkę: czas otwierania rolety mam ustawione w cloud na 20 sekund. Klikam w aplikacji otwórz, roleta podnosi się przez 20 sekund. Roleta jest otwarta. Podchodzę teraz do przycisku podnoszenia na ścianie, klikam i przekaźnik załącza się na 20 sekund. Czy kliknięcie przycisku na ścianie nie powoduje requestu do cloud o stan rolety ? Da się zrobić tak aby arduino znało stan rolety (bez czujnika fizycznego, stan musiał by znać na podstawie przeprowadzonych operacji) ?

Z góry dziękuje za odpowiedzi.
Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Musisz dodać pamięć FRAM.
emil_seba
Posty: 16
Rejestracja: wt kwie 24, 2018 6:21 am

Dziękuje za szybką odpowiedź, czy stosowne jest użycie zapisu na SD zamiast FRAM ? Coś mi się zdaje że może być problem z uwagi na możliwość obsługi w danym czasie jednego pliku.
Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Możesz zapisać na karcie SD ale do tego musisz zrobić własną obsługę. Do FRAM-u masz gotowy przykład.
git
https://github.com/SUPLA/arduino/tree/m ... utter_FRAM
emil_seba
Posty: 16
Rejestracja: wt kwie 24, 2018 6:21 am

testuje rozwiązanie jeszcze bez pamięci FRAM, karty SD i mam taki przypadek. Otóż w cloudzie mam ustawione czas otwarcia/zamknięcia na 10 sekund. Po kliknięciu w aplikacji przekaźnik jest załączany na 110% ustawione czasu (zgodnie z założeniem). Jeżeli natomiast wcisnę przycisk fizyczny to czas załączenia przekaźnika wynosi 210 %. Czy dla tego przypadku instalacja pamięci również da oczekiwany efekt ?


Kod: Zaznacz cały

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

#define BTN_COUNT 1  // definiujemy ile ma być przycisków 

#define MY_DEBUG


//***********button*****************//
 typedef struct {
  int pin;
  int relay_pin;
  int channel;
  int ms;
  char last_val;
  unsigned long last_time;
  char name;
} _btn_t;

_btn_t btn[BTN_COUNT];

void supla_timer() {
  char v;
  unsigned long now = millis();
  for(int a=0;a<BTN_COUNT;a++) {
    if (btn[a].pin > 0) {
        v = digitalRead(btn[a].pin);
        if (v != btn[a].last_val && now - btn[a].last_time ) {
           btn[a].last_val = v;
           btn[a].last_time = now;
           if (v==0)
            {
                 #ifdef MY_DEBUG
                        Serial.println("Pin was pushed " + String(btn[a].pin));
                 #endif
                 if ( btn[a].ms > 0 ) {
                     SuplaDevice.relayOn(btn[a].channel, btn[a].ms);
                      #ifdef MY_DEBUG
                        Serial.println("Set relay on time " + String(btn[a].pin) + " for time: " + String(btn[a].ms));
                       #endif
                 } 
                 else if (digitalRead(btn[a].relay_pin) == 0 ) {
                      SuplaDevice.relayOff(btn[a].channel);
                 } 
                 else {
                      #ifdef MY_DEBUG
                        Serial.println("Set relayOn on chanel " + btn[a].pin);
                      #endif
                      SuplaDevice.relayOn(btn[a].channel, 0);
                 }    
            }
        }
    }
  }
}



void supla_btn_init() {
  #ifdef MY_DEBUG 
    Serial.println("Enter supla_btn_init");
  #endif
  for(int a=0;a<BTN_COUNT;a++)
  {
    if (btn[a].pin > 0) {
        pinMode(btn[a].pin, INPUT_PULLUP); 
        btn[a].last_val = digitalRead(btn[a].pin);
        btn[a].last_time = millis();
    }
  }
}



void setMyButton()
{
  memset(btn, 0, sizeof(btn));
  btn[0].pin = 48; //pin pod którym masz przycisk (wewnętrzny PULLUP)
  btn[0].relay_pin = 44; //pin pod który podłączony jest przekaźnik
  btn[0].channel = 0; //numer kanału na którym jest przekaźnik
  btn[0].ms = 0;  //jak zero to ma być cały czas włączony
  btn[1].pin = 49; 
  btn[1].relay_pin = 45;
  btn[1].channel = 1;
  btn[1].ms = 0; 
}
void setMyRoller()
{
  
  SuplaDevice.addRollerShutterRelays(62,     // 46 - Pin number where the 1st relay is connected   
                                     63);    // 47 - Pin number where the 2nd relay is connected  

  SuplaDevice.setRollerShutterButtons(0,    // 0 - Channel Number 
                                      2,   // 20 - Pin where the 1st button is connected
                                      3);  // 21 - Pin where the 2nd button is connected
}

void setup() {

  Serial.begin(9600);
  setMyButton();
  supla_btn_init();
  SuplaDevice.setTimerFuncImpl(&supla_timer);

  
  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {xxxxxxxxxxxyyyyyyyyyyyyzzzzzzzzzzzzzzzz};
  // 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, 0x7};

  setMyRoller();

  // CHANNEL0 - RELAY
  SuplaDevice.addRelay(44, true);           // 44 - Pin number where the relay is connected      
                                      // Call SuplaDevice.addRelay(44, true) with an extra "true" parameter 
                                      // to enable "port value inversion"
                                      // where HIGH == LOW, and LOW == HIGH   

  // CHANNEL1 - RELAY
  //SuplaDevice.addRelay(45, true);           // 45 - Pin number where the relay is connected   


  /*
   * SuplaDevice Initialization.
   * Server address, LocationID and LocationPassword are available at https://cloud.supla.org 
   * If you do not have an account, you can create it at https://cloud.supla.org/account/create
   * SUPLA and SUPLA CLOUD are free of charge
   * 
   */

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

}

void loop() {
  SuplaDevice.iterate();
}

Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Po co robisz obsługę przycisków ?

bool addRollerShutterRelays(int relayPin1, int relayPin2, bool hiIsLo);
bool addRollerShutterRelays(int relayPin1, int relayPin2);
void setRollerShutterButtons(int channel_number, int btnUpPin, int btnDownPin);
emil_seba
Posty: 16
Rejestracja: wt kwie 24, 2018 6:21 am

pzygmunt pisze: śr mar 20, 2019 8:33 pm Po co robisz obsługę przycisków ?

bool addRollerShutterRelays(int relayPin1, int relayPin2, bool hiIsLo);
bool addRollerShutterRelays(int relayPin1, int relayPin2);
void setRollerShutterButtons(int channel_number, int btnUpPin, int btnDownPin);
Przepraszam, ale nie rozumiem pytania ?
Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Wywal wszystko i zostaw tylko
addRollerShutterRelays
I
setRollerShutterButtons
emil_seba
Posty: 16
Rejestracja: wt kwie 24, 2018 6:21 am

tylko że pozostałe rzeczy potrzebuję do obsługi wł/wył światła. Pozostałe rzeczy nie tykają pinów przekazanych do wywołania funkcji

addRollerShutterRelays
I
setRollerShutterButtons
Awatar użytkownika
pzygmunt
Posty: 18277
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontakt:

Zostaw tylko to co napisałem i sprawdź wtedy czy jest OK. Pamiętaj, że pełne otwarcie/zamknięcie celowo trwa dłużej ponieważ zadaniem krańcówki jest zatrzymanie rolety. Ważne aby się nie rozjechała realna pozycja rolety względem tego co widać w aplikacji.
ODPOWIEDZ

Wróć do „Ogólna dyskusja”