Czy brama jest zamknięta?

kontrakton arduino

Na pewno każdy człowiek raz na jakiś czas zadaje sobie pytanie? Czy wyjeżdżając z garażu zamknąłem bramę? Czy na pewno się ona opuściła? Czy skrzydła bramy wjazdowej się domknęły, bo raczej nikt nie czeka po wyjeździe 30 sekund aż wszystko się zamknie. Tak, ja też nie czekam, nie czekałem i nie będę. I w ten sposób powstał mechanizm pozwalający zweryfikować on line czy wszytsko jest ok z bramą, gdy domowników nie ma w domu.

 Mechanizm a raczej projekt poza kablami zasilającymi i sygnalowymi wymaga:

1. arduino (nano, leonardo, uno, mega… cokolwiek),
2. modułu esp8266 do wrzucania danych na serwer,
3. kontraktona służącego, jako włącznik krańcowy,
4. konwertera poziomów logicznych (5v, 3.3v),
5. serwera plików z bazą danych,
6. może jakąś domenę,
7. chęci wykonania,
i kliku oporników 10k

Założenie jest takie, aby na bramie, a raczej na zawiasie jednego ze skrzydeł bramy zamocować kontraktor, kóry w momencie jej zamkniecia lub otwarcia zakmnie lub otworzy obwód, tym samym zmieni się stan pinu w mikrokontrolerze, co spowoduje akcję wysłania danych na serwer za pomocą esp 8266 (stanu bramy – otwartej lub zamniętej) i zapisania tego stanu w bazie, do której później można napisać sobie panel do przegladania tabeli (z loginem hasłem, godziną itp)  w php.

Warunkiem poprawnego odczytywania stanów bramy jest poprawne czyli stabilne zamocowanie kontraktona na zawiasie bramy. Ciężko kupić uchwyt w sklepie, trzeba sobie taki zrobić samemu. Albo z biodegradowalnej sklejki albo z syntetycznego materiału, który się używa do druku 3d. Umięjętności wymiarowania i modelowania 3d się przydały, drukarka 3d Brata również więc mocowanie się udało.

Teraz najlepsze – skrypt do arduino:

#define TIMEOUT     5000
#define DEST_IP2    "panzpogodna.pl"
#define DEST_HOST2   "panzpogodna.pl"

char bufor [60];

const int closeGatePin = 8;
int closeGateButtonLastState = 0;

void setup() {

delay(3000);

Serial.println("pan z pogodnia wita");

delay(3000);

pinMode(closeGatePin, INPUT);

Serial.begin(9600);
Serial1.begin(115200);
Serial1.setTimeout(TIMEOUT);

delay(2000);

if (wyslij("AT+RST", "OK", 200))
  Serial.println("Reset esp8266");

while (!wyslij("AT", "OK", 200)) {
  Serial.println("error on esp8266");
  delay(1000);
}
delay(1000);

wyslij("AT+CIPMODE=0", "OK", 500);
Serial.println("CIPMODE - OK!");
delay(1000);

wyslij("AT+CIPMUX=1", "OK", 500);
Serial.println("CIPMUX - OK!");
wyslij("AT+CWMODE=1", "OK", 500);

wyslij("AT+CWJAP=\"{nazwaSieciWifi}\",\"{haslo}\"", "OK", 5000);

Serial.println("Polaczono z siecia!");

wyslij("AT+CIPSERVER=1,80", "OK", 5000);
Serial.println("Uruchomiono serwer :)");

}

void loop() {

int readingClose = digitalRead(closeGatePin);
if (readingClose != closeGateButtonLastState) {
  if (readingClose == HIGH) {
    registerBramaMovement("close", "yes");
  }else{
    registerBramaMovement("close", "no");
  }
}
closeGateButtonLastState = readingClose;

}

void registerBramaMovement(String action, String state) {

Serial.println("registerBramaMovement");
delay(1000);

String cmd = "AT+CIPSTART=1,\"TCP\",\""; cmd += DEST_IP2; cmd += "\",80";
if (wyslij(cmd, "OK", 400)) {
  Serial.println("AT+CIPSTART=1");
}

delay(1000);

Serial1.println("AT+CIPSTATUS=?");
if (wyslij("AT+CIPSTATUS", "OK", 400)) {
  Serial.println("AT+CIPSTATUS OK");
}

cmd = "GET /skrypt/brama.php?" + String(action) + "=" + String(state) + " HTTP/1.1\r\nHost: "; cmd += DEST_HOST2; cmd += ":80\r\n\r\n";

delay(1000);

sprintf(bufor, "AT+CIPSEND=%d,%d", 1, cmd.length());
if (wyslij(bufor, ">", 400))
  Serial.println("Wysylanie");
if (wyslij(cmd, "OK", 400))
  Serial.println("Wyslano");
if (wyslij("AT+CIPCLOSE=1", "OK", 400)) {
  Serial.println("Zamknieto");
}
}

boolean wyslij(String Komenda_AT, char *Odpowiedz_AT, int czas_czekania) {
Serial1.println(Komenda_AT);
delay(czas_czekania);
while (Serial1.available() > 0) {
  if (Serial1.find(Odpowiedz_AT)) {
    //Serial.write(Serial1.read());
    return 1;
  }
}
return 0;
}

Jeżeli chodzi o skrypt php to sprawa jest na inny tutorial, zwykły $_GET i INSERT do bazy załatwia sprawę

Tego typu rozwiązania można rozszerzyć o moduł GSM, który na komendy będzie otwierał lub zamykał bramę lub po prostu odczytywał stan kontraktora na bieżąco po otrzymaniu wiadmości o konkrtenej treści i odeśle SMS zwrotnego ze statusem bramy.

A tak to wygląda w całości


Opublikowano: 17 marca, 2017 przez Pan z Pogodna

One thought on "Czy brama jest zamknięta?"

  1. Pingback: Pan z Pogodna 3.0

Leave a Reply