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.
Arduino Rolety przycisk na ścianie
Musisz dodać pamięć FRAM.
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
git
https://github.com/SUPLA/arduino/tree/m ... utter_FRAM
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();
}
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);
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 ?
Wywal wszystko i zostaw tylko
addRollerShutterRelays
I
setRollerShutterButtons
addRollerShutterRelays
I
setRollerShutterButtons
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.