Skocz do zawartości

Arduino - sterowanie z poziomu strony www


Pomocna odpowiedź

Napisano

Witam.

Mam zrobiony projekt na arduino UNO z modułem ethernet shield. Bez problemu wysyłam kilka zmiennych do bazy danych SQL. Chciałbym (i po części muszę :P) rozbudować ten projekt o dodatkową możliwość. Mianowicie chodzi mi o to, by po naciśnięciu przycisku na stronie (zwykły button z napisem np. "Potwierdź") arduino odebrało odpowiedni sygnał i zapaliło diodę LED. Zadanie niby proste, ale nie mogę tego rozgryźć :( Proszę o pomoc.

52 minuty temu, gapcio15 napisał:

Mianowicie chodzi mi o to, by po naciśnięciu przycisku na stronie (zwykły button z napisem np. "Potwierdź") arduino odebrało odpowiedni sygnał i zapaliło diodę LED.

Możesz opisać to trochę dokładniej? Co znaczy, że Arduino ma odebrać odpowiedni sygnał?

Mam stronę internetową i na niej przycisk z napisem, np. "Potwierdź". Arduino łączy się z internetem po ethernecie. I chodzi o to, żeby po wciśnięciu tego przycisku "Potwierdź", zapaliła się dioda LED, którą mam podłączoną do Arduino.

Stronę hostujesz w sieci lokalnej z osobnego urządzenia czy Arduino? Jeżeli Arduino ma łączyć się ze stroną hostowaną z zewnątrz to będziesz musiał podziałać z ustawieniami routera i otworzyć porty i pomyśleć o stałym ip.

A co do obsługi ethernetu to nie ma tam przykładu ze sterowaniem czegokolwiek ze strony internetowej?

@kaczakat tylko w tych poradnikach strona jest "trzymana na Arduino" i wtedy reagowanie na przycisk jest bardzo proste. Jeśli rozumiem, to @gapcio15 poszukuje rozwiązania, w którym strona nie znajduje się na Arduino tylko na jakimś innym serwerze.

9 minut temu, gapcio15 napisał:

Niestety, strona znajduje się na zewnętrznym hostingu, nie na Arduino 😞  

No i skomplikowałeś... 😄

Masz zewnętrzne IP i dostęp do routera, przekierujesz port na Arduino, tak żeby był sens dalej pisać? Jak tak to poszukam, bo gdzieś miałem taki przykład.

3 minuty temu, kaczakat napisał:

No i skomplikowałeś... 😄

Masz zewnętrzne IP i dostęp do routera, przekierujesz port na Arduino, tak żeby był sens dalej pisać? Jak tak to poszukam, bo gdzieś miałem taki przykład.

Mam IP strony na hostingu. Nie wiem jak przekierować port na Arduino 😞 Jestem zielony jeśli chodzi o takie rzeczy xd

A bez tego nie da rady tego zrobić? Przecież nawet jeżeli dostosuję się do jednego routera, to będę musiał zaprezentować działanie podpinając się do innego.

To załóżmy, że masz przekierowany port i dostęp do routera. Najbardziej prymitywnym rozwiązaniem jest użycie GET i tego nie robię, ale powiedzmy, że do pierwszych testów...

Jakiś kod HTML masz, masz przycisk, a podanym wcześniej przykładzie była stronka, która po zaznaczeniu checkbox wysyłała komunikat LED do serwera, na którym była uruchomiona. Taki komunikat można wysłać w dowolne miejsce używając:

<!DOCTYPE html>
<html>
<head>
<title>Arduino LED Control</title>
</head>
<body>
<h1>LED</h1>
<p>Click to switch LED on and off.</p>
<form action="http://192.168.1.153" method="GET">
    <input type="submit" value="LED2" 
         name="Submit" id="frm1_submit" />
</form>
 
</body>
</html>

Jak widać podałem adres http, czyli miejsce gdzie jest przycisk. Kod tego przycisku może być na PC, tu otwierasz stronę, a po wciśnięciu GET poleci na to IP.  Teraz wystarczy w Arduino odczytać wartość LED2 i zmienić stan led. Niestety strona zostaje przeniesiona na serwer Arduino i trzeba się cofnąć. Nie udało mi się tego rozwiązać więc teraz robię inaczej.

Po krótkim kursie "youtubowym" HTML, JS, CSS 

i websocket zrobiłem sobie stronkę z kilkoma przyciskami i polami tekstowymi. Uruchamiam ją na ESP8266 (ale jest też wersja biblioteki websocket dla Ethernet shield).  Dalej w podlinkowanym kursie do Ethernet shield jest też coś o Ajax, to poprzednik websockets więc już raczej nie będę w to brnął, ale zasada byłaby podobna.

Tu jest działający przykład na ESP8266 https://github.com/kaczakat/ESP8266 (i obok dla ESP32), kod strony jest w kodzie programu (może być też w spiffs lub w osobnym pliku *.h), a dla Ethernet shield również na SD. Program wgrany do uC ESP obsługuje 5 połączeń jednoczesnych, można się zalogować do strony na ESP i tu sobie klikać lub w dowolnym miejscu, np. na PC czy na serwerze umieścić inny plik html gdzie wewnątrz zamiast 

websock = new WebSocket('ws://' + window.location.hostname + ':81/');
jest np.:
websock = new WebSocket('ws://192.168.1.155:81/');

Lub jeśli Twój IP jest zmienny i port przekierowany z 5345 na 81 to może być coś takiego:

websock = new WebSocket('ws://gapcio15.dyndns.com:5345/');

Zaletą websocket jest szybkość i dwukierunkowość, jeśli na telefonie klikniesz zaświecenie LED1 to wszyscy klienci od razu dostają aktualizację stanu wyjść.

Screenshot_55.thumb.jpg.f438c77a97037d2d67c55872b154cbac.jpg

Screenshot_56.thumb.jpg.b9f58d59b0cf8dec4ea3d6605dd4b5f3.jpg

Jak widać są dwa okienka, jedno otwarte z uC, drugie z PC (serwera ze stroną HTML). W sumie to chodzi o to, by po umieszczeniu w uC obsługi websocket z serwera przyleciało najpierw zalogowanie się do Arduino, a potem wysyłanie odpowiedniego komunikatu.

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...