Arduino i MySQL

php-mysqlW dzisiejszym wpisie zaprezentuje łatwy sposób jak połączyć Arduino i Mysql aby zwiększyć jego możliwości. Pokażę jak wrzucić odczytane dane do bazy MySQL a następnie wyświetlić je w przejrzystej i responsywnej stronie www. Jako przykład posłuży nam czujnik ruchu PIR HC-SR501. Będziemy wysyłać na serwer informację o wykrytym ruchu, lecz w zależności od potrzeb można wysyłać różne dane np: pomiary temperatury, użycie kart RFid czy naciśnięcie przycisku podłączonego do arduino.  Aby wysyłać dane na zewnętrzny serwer niezbędne będą następujące elementy:

  • Arduino Uno
  • Ethernet Shield
  • Czujnik ruchu PIR HC-SR501
  • Router, kabel ethernet
  • Dioda led, rezystor
  • Płytka prototypowa, kable połączeniowe
  • serwer z obsługą PHP i MySQL

Problem można rozwiązać na kilka sposobów. Pierwszy sposób – Arduino łączy się bezpośrednio z bazą danych MySQL i wysyła dane do odpowiedniej tabeli. Drugi sposób polega na tym, że Arduino uruchamia wcześniej przygotowany skrypt PHP i przesyła dane w zmiennej $POST. Nie jestem ekspertem od bezpieczeństwa i nie wiem która metoda jest bezpieczniejsza. Wydaje mi się, że bezpieczniej jest uruchomić zdalnie skrypt PHP (drugi sposób), niż przesyłać dane do serwera za każdym żądaniem wrzucenia danych do tabeli.

Opis procesu
Opis procesu

Opis procesu:

  1. Arduino monitoruje stan pinu do którego jest podpięty czujnik ruchu, czujnik działa cyfrowo więc wysyła stan 0 lub 1.
  2. Jeżeli został wykryty ruch, na pinie 6 pojawia się stan wysoki czyli „1”. Jest to warunek aby nawiązać połączenie z serwerem.
  3. W przypadku gdy na pinie 6 jest stan niski – nie łączymy się z serwerem. Dzięki temu ograniczamy pasmo i ilość wysłanych danych.
  4. Arduino po nawiązaniu połączenia z serwerem uruchamia skrypt PHP i przekazuje zmienną informującą o wykryciu ruchu.
  5. Skrypt pobiera zmienną i zapisuje do bazy. Dodatkowo w bazie danych MySQL została użyta funkcja CURRENT_TIMESTAMP, która automatycznie dopisuje datę i godzinę pomiaru.
  6. Odczekujemy kilka sekund aby nie wpisywać tego samego wykrycia do bazy.

Szkic Arduino: (POBIERZ)

Schemat układu:

układ
układ

Jak widać schemat jest bardzo prosty. Dioda led została umieszczona tylko w celach diagnostycznych, aby mieć pewność że czujnik działa prawidłowo. Do układu ethernet shield został podpięty kabel ethernet. Jest to niezbędne aby Arduino otrzymało komunikację z internetem.

Musimy utworzyć bazę danych i tabelę która będzie przechowywać pomiary. Polecam do tego użycie narzędzia phpMyAdmin i opcję importu. Plik z gotową bazą do importu można pobrać stąd.

Kolejnym krokiem jest wrzucenie na serwer skryptów PHP, które umożliwią zapisanie danych do bazy MySQL i wyświetlenie ich w czytelnej formie. Gotowy skrypt można pobrać tutaj.

Następnym krokiem jest uzupełnienie danych w pliku connect2.php. Musimy podać dane naszego serwera takie jak adres, nazwa użytkownika, hasło oraz nazwę bazy danych.

Ostatnim etapem jest wgranie poprawionych plików na nasz serwer www. Aplikację uruchamiamy podając ścieżkę nazwaserwera/index.php

Widok aplikacji:

widok pomiarów
widok pomiarów

 

 

Jeszcze raz krok po kroku:

  1. Budowa układu Arduino + Ethernet Shield wraz z czujnkiem ruchu
  2. Podłączenie Ethernet shield do sieci LAN
  3. Wgranie sketcha, test na diodzie LED
  4. Utworzenie bazy danych
  5. Podmiana danych do serwera, wrzucenie na właściwy serwer PHP
  6. Uruchomienie skryptu index.php

Gdyby były problemy z uruchomieniem, jestem do Waszej dyspozycji.

Miłego majsterkowania!

33 myśli na temat “Arduino i MySQL

  1. Ja niestety mam problem z zaimportowaniem bazy danych przy użyciu phpMyAdmin. Komunikat poniżej. Jesteś w stanie jakoś z tym pomóc?
    ———————————————————————————————————————————————————
    Błąd
    Zapytanie SQL:

    — — Baza danych: jacekpie_arduino — — ——————————————————– — — Struktura tabeli dla tabeli ruchLog — CREATE TABLE IF NOT EXISTS ruchLog ( timeStamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UP[…]

    MySQL zwrócił komunikat: Dokumentacja
    #1046 – No database selected

    ———————————————————————————————————————————————————

    1. Musisz utworzyć bazę danych o nazwie „jacekpie_arduino” najlepiej przy użyciu phpmyadmin. Następnie będąc w środku nowo utworzonej bazy dokonujesz importu.

  2. Jak wysyłać dużą ilość danych np w tablicach danych. Przydałoby się w tym skromnym cc coś takiego jak w jquery ajax serialize. Ja planuję wysyłać ok 130 danych. Może ktoś zna sposób jak to zrobić

    1. Umieściłbym te dane w tablicy. Następnie metodą $POST wysłał do serwera PHP i za pomocą pętli dokonał już konkretnej operacji (zapis/przegląd).

  3. Dzień dobry

    Pozwoliłem sobie skorzystać z powyższego kodu, nieznacznie modyfikując go pod inny czujnik, celem zrozumienia zasady działania całości, ale mam pytanie.
    Chodzi o linie 38 i 40. Mam tam wpisać to samo, tzn. adres IP ? Swój adres, czy adres 127….. czy jeszcze coś innego ? Jestem z zawodu i pasji elektronikiem (głównie hardware), a o sieciach nie mam pojęcia 🙂

    Ogólnie pobrane pliki mam w folderze htdocs w xampie i wpisując w wyszukiwarkę local host, widzę stronę z dwoma przykładowymi pomiarami, które już są w bazie.

    PHP uzupełniłem chyba poprawnie
    $server=”localhost”;
    $user=”damian”;
    $pass=”hasło”;
    $db=”jacekpie_arduino”;

    Proszę o pomoc
    Damian
    D.G

    1. Damian, w linii 38 i 40 podajesz IP serwera, na którym umieszczony jest skrypt PHP, w twoim wypadku localhost (127.0.0.1). Jeżeli widzisz przykładowe dane to znaczy że skrypt PHP się uruchamia i jest połączenie z bazą danych.

  4. A co w przypadku, gdy pliki *.php nie są w katalogu głównym a w np. arduino, czyli jakas_domena.pl/arduino/ ? jak to umieścić w liniach 38 – 40 ? próbuję i niestety nic mi się nie dopisuje do bazy, natomiast jak wywołam z przeglądarki add2.php to dane się dopisują, czy konfiguracją bazy wszystko jest ok 🙂

    Pozdr

  5. Tak też zrobiłem, niestety to nie działa, niby connect() zwraca mi true ale dalej nic się nie dzieje, tak jakby nie odczytało pliku add2.php.

    Pozdr

    1. Standardowa biblioteka która jest w Arduino. Niestety nigdy nie korzystałem z localhost (xampp). Teoretycznie nie powinno być problemów, gdyż jest to tylko http-request. Sprawdź Arduino czy ma dostęp do sieci (puść ping i zobacz czy odpowiada). Adres jaki otrzymalo Arduino znajdziesz w panelu routera w opcjach dhcp client.

  6. Nie korzystam z DCHP, mam na stałe przypisany adres, bramę, subnet i DNS.

    IPAddress myIP(192,168,2,205);
    IPAddress mySIP(255,255,255,0);
    IPAddress myGIP(192,168,2,15);
    IPAddress myDNS(194,204,152,34)

    a w setup :
    Ethernet.begin(mac, myIP, myDNS, myGIP, mySIP);

    Ping odpowiada więc do tego momentu jest ok. Muszę chyba mysql i serwer www postawić lokalnie na kompie, wtedy będę miał logi.

    Pozdr

  7. To przynajmniej wiem gdzie nie szukać problemu, moduł ethernet działa ok. Poniżej kawałek logu z serwera www :

    [client 192.168.2.205:1025] AH00126: Invalid URI in request GET add2.php HTTP/1.1

    Czyli jest problem w tym co moduł wysyła do serwera, serwer po prostu nie potrafi tego zinterpretować.

    Jakieś pomysły ?

    Pozdr

    1. Mam taki log błędu, co zrobić jak żyć?

      [Wed May 18 22:06:51.259036 2016] [:error] [pid 6572:tid 1656] [client 127.0.0.1:49689] PHP Notice: Undefined index: ruch1 in C:\\xampp\\htdocs\\add2.php on line 6
      [Wed May 18 22:06:51.259036 2016] [:error] [pid 6572:tid 1656] [client 127.0.0.1:49689] PHP Notice: Undefined variable: ruch1 in C:\\xampp\\htdocs\\add2.php on line 10

  8. Ok, po długich bojach doszedłem do końca, musiałem zmienić bibliotekę na Ethercard i teraz wszystko śmiga jak należy. Zmieniłem też oczywiście cały sketch bo ta biblioteka używa innych funkcji.

    Twój artykuł bardzo mi się przydał – wielki dzięki 🙂

    1. Rozumiem że, przy użyciu Arduino Mega należy zamienić bibliotekę? Posiadam Arduino Mega lecz nie używałem go jeszcze z ethernet shield.

  9. Panie Jacku sukces !, dziękuję 🙂
    Pytałem na początku o XAMPP’a 🙂 Problem był w routerze, a raczej jego braku i paru linijkach kodu, z racji innych bibliotek do obsługi Ethernetu. Teraz walczę z własną bazą danych i połączeniem całości 🙂

    pozdrawiam

    1. Supe,r że udało się rozwiązać problem. Każdy artykuł przed publikacją sprawdzam czy nie zawiera błędów i czy działa poprawnie. Gdybym mógł pomóc coś z bazami – proszę o kontakt 🙂

      1. W takim razie miałbym jeszcze jedno pytanie 🙂 W zasadzie chodzi bardziej o wyjaśnienie.

        W pliku add2.php jest linijka:

        $temp1=$_GET[„$ruch1”];

        Jak rozumiem zapisuje ona do zmiennej tymczasowej temp1, wartość zmiennej ruch1. Z tym, że zamotałem się skąd brana jest ta wartość. $_GET pobiera dane z paska wyszukiwarki, natomiast w kodzie arduino wysyłany jest ciąg „data”:

        client.println(data.length());
        client.println();
        client.print(data);

        Więc w tym przypadku w kolumnie ruch1, bazy danych, powinna pojawić się wartość zmiennej ruch1 czyli „ruch1tak” ? W bazie danych kolumna ruch1 jest typu INT, stąd też nabieram wątpliwości w moje rozumowanie 😀

  10. hallo właśnie próbuję połączyć się z db ale cały czas otrzymuje błąd

    Fatal error: Uncaught Error: Call to undefined function mysql_connect() in C:\xampp\htdocs\connect2.php:9 Stack trace: #0 C:\xampp\htdocs\index.php(36): Connection() #1 {main} thrown in C:\xampp\htdocs\connect2.php on line 9

    a connect2.php wypełniłem tak

    function Connection(){
    $server=”localhost”;
    $user=”root”;
    $pass=”gorol11″;
    $db=”jacekpie_arduino”;

    co jest nie tak, proszę o poradę

    1. problem rozwiązany, okazało sie że wersja php 7 nie obsługuje jakichś poleceń sql,., zgrałem wersję 5 i wszystko śmiga 🙂

      https://dev.mysql.com/doc/apis-php/en/apis-php-function.mysql-connect.html

      Warning

      This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:
      mysqli_connect
      PDO::__construct

      1. Tak, w nowej wersji PHP wyłączone są stare metody połączeniowe. W najbliższym czasie postaram się zaktualizować wpis i wykonać połączenie za pomocą PDO.

  11. WItam serdecznie,

    Skorzystałem z tego poradnika do wysyłania danych do MySQL z czujnika temperatury LM35DZ przy pomocy Arduino Uno i Ethernet Shield 2.

    Połączenie jest ale wartość temperatury w bazie wynosi 0

    int odczyt = analogRead(czujnik);
    VOLT = (odczyt * 5.0) / 1024.0;
    temp = VOLT * 100;

    //TUTAJ SPRAWDZAŁEM CZY DOBRZE ODBIERA TEMPERATURĘ W MONITORZE PORTU
    Serial.print(„temp=”);
    Serial.println(temp);

    data = „temp” + temp;

    if (client.connect(„www.subdomena.domena.pl”,80)) {
    client.println(„GET /temperatura/add.php HTTP/1.1”);
    client.println(„Host: subdomena.domena.pl”); // SERVER ADDRESS HERE TOO
    client.println(„Content-Type: application/x-www-form-urlencoded”);
    client.print(„Content-Length: „);
    client.println(data.length());
    client.println();
    client.print(data);

    Plik php*

  12. Prosiłbym o pomoc w zrozumieniu tych linijek:
    string conf=”tak”;

    data = „ruch1″+ conf;
    ….
    client.println(data.length());
    client.println();
    client.print(data);

    Jakie dane są przesyłane do sql ? jak rozumieć ten zapis, prosiłbym o wytłumaczenie czy data może przyjmować wartości z pinu ADC

    1. Do mysqlsql leci informacja o ruchu „TAK” czyli wykrycie zmiany na pinie cyfrowym. Oraz „wypełniacz” pola data – po stronie mysql jest funkcja autodate, która sama wypełnia pole z datą. Jeżeli chcesz wysłać do mysql wartość z jakiegoś pinu to musisz zamienić typ danych na int i przypisać wartość do zmiennej conf.

  13. Mam problem, poniewaz baza danych wszystko polaczenie działa, lecz Arduino nie chce sie polaczyc z serwerem aby dodac nowy rekord do bazy danych. Jezeli wejde : 127.0.0.1/add2.php – to automatycznie doda mi nowy rekord , wiec konfiguracja dziala. Po prostu Arduino nie chce sie polaczyc z moim serwerem na XAMPP jak i Localhost.
    Moj kod Arduino ( moze tu zle wpisalem dane) :
    if (client.connect(„127.0.01”,80)) { // REPLACE WITH YOUR SERVER ADDRESS
    client.println(„GET add2.php HTTP/1.1”);
    client.println(„Host: 127.0.01”); // SERVER ADDRESS HERE TOO
    client.println(„Content-Type: application/x-www-form-urlencoded”);
    client.print(„Content-Length: „);
    client.println(data.length());
    client.println();
    client.print(data);

    Nawet zamiast 127.0 .0.1 – wpisałem Locahost i nie działa. Dodam ze program dziala poniewaz ruch wykrywa po zapaleniu lampki oraz w oknie roboczym programu Arudino sa informacje gdy wykrywa ruch, a gdy nie.

      1. Przepraszam – moj blad poniewaz pisalem to z reki. Mimo to dalej nie łączy – nie wyskakuje błedu w LOG z DHCP serwera..

  14. Mam problem , ponieważ wszystko działa – baza danych , Arduino łączy sie z serwerem – lecz wyskakuje informacja od strony serwera gdy probuje sie polaczyc arduino: 192.168.1.2 – – [02/Nov/2017:17:20:09 +0100] „GET add2.php HTTP/1.1” 400 326 „-” „-”

    Jezeli dobrze sie orientuje , to arudino laczy sie z serwerem wszystko jest dobrze, ale nie dodaje rekordu do bazy danych. Gdy wejde w adres : 192.168.1.2/add2.php to dodaje nowy rekord ,wiec jezeli dobrze mysle to Arduino laczy sie z serwerem lecz gdzies jest blad i nie dodaje nowego rekordu. Pomoze ktos?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *