VIDI Project X #48: VIDI X mikroračunalo i MySQL server

VIDI Project X #48: VIDI X mikroračunalo i MySQL server

VIDI X kao tihi alarm

U ovom projektu koristit ćemo ultrazvučni senzor udaljenosti i VIDI X mikroračunalo te ćemo pod određenim uvjetima dobivena očitanja zapisati u MySQL bazu podataka za kasniju analizu.

Kompletan kod radionice pronađite na GitHubu na linku: https://github.com/VIDI-X/MySQL_Insert_Silent_Alarm

 

Ultrazvučni senzor udaljenosti iskoristit ćemo kao senzor koji detektira prisutnost u prostoriji ukoliko detektira objekt na udaljenosti unutar 100 cm. Takav senzor može se postaviti na štok vrata s gornje strane te gledati prema dolje. Ukoliko kroz vrata prođe bilo tko viši od metra, senzor će ga detektirati, ali neće detektirati pse ili mačke koji tako neopaženi mogu prolaziti tim prolazom.

OTVORNA_MG_5624-1024x683

Ovime određujemo zonu motrenja koju, prema želji, programski možete povećati ili smanjiti.

Kada napravite ovaj projekt, neće vam biti teško ultrazvučni senzor zamijeniti nekim drugim koji će vam više odgovarati, poput senzora kvalitete zraka ili senzora potrošnje struje i sl.

Što se tiče predznanja za ovaj projekt, bilo bi poželjno poznavati osnove MySQL Queryja, no ne poznajete li ga, ovdje ćete naći neke osnove od kojih možete krenuti u daljnje istraživanje.

Za ovu radionicu trebat će vam VIDI X mikroračunalo i HC-SR04 ultrazvučni senzor udaljenosti.

Ukoliko nemate takav senzor, kod će zapisivati vrijednost nula u MySQL bazu podataka, pa svejedno možete eksperimentirati s kodom te ga prilagoditi za slanje podataka nekog drugog senzora.

Kao prvi korak bit će vam potrebna MySQL baza podataka. Gotovo svi web hosting paketi uključuju pristup MySQL bazi podataka. No kod nekih, ovisno o zakupljenom paketu, može biti slučaj da vam ne dozvole direktan pristup MySQL bazi s vaše lokacije ili općenito s vanjskih uređaja.

Ako imate MySQL server kojem je moguće pristupati direktno, moći ćete iskoristiti tu bazu za ovaj projekt, no mi ćemo vam u nekoliko koraka pokazati kako možete dobiti pristup malenoj i doista ograničenoj, ali besplatnoj MySQL bazi podataka.

 

slika-1-1024x657

1. Posjetite web strancu https://www.freemysqlhosting.net i kliknite na gumb Start my Free Account

2. Upišite svoj mail, na koji ćete dobiti pristupne podatke za novokreirani račun i kasnije za bazu podataka nakon klika na gumb Register

slika-3

3. Kliknite na link unutar pristiglog maila

slika-4

4. Odaberite ponuđenu lozinku ili ju promijenite u neku drugu

slika-5

5. Odaberite regiju iz koje se spajate na bazu. Nakon odabira, kliknite na Complete my Registration

slika-6-1024x411

6. U gornjem dijelu vidite podatak kako na raspolaganju imate jednu bazu veličine do 5 MB. Odaberite lokaciju servera s padajućeg menija te kliknite na Save Location. Ovo je bitno ispravno odabrati jer je moguće da pomogne u odabiru servera za vašu regiju, pa ćete time dobiti mrvicu brži server nego da ste odabrali neku regiju s druge strane zemaljske kugle. Sada kliknite na gumb Start New Database. Nakon nekoliko trenutaka na vaš mail će stići podaci potrebni za spajanje na novokreiranu bazu podataka. Sada možete kliknuti na link od phpMyAdmin stranice u koju ćete upisati pristupne podatke za MySQL bazu podataka kako biste lakše upravljali svojom bazom.

slika-7

7. Popunite polja podacima iz maila pomoću copy-paste

slika-8-1024x461

8. Prvo morate kliknuti na svoju bazu podataka kako biste ju selektirali. Zatim kliknite na SQL tab (drugi po redu) kako biste došli do prozora za unos MySQL Queryja

slika-9-1024x455

9. Ovdje unesite Query pomoću copy-paste iz preuzete datoteke imena MySQL_Database.txt, te zatim kliknite na GO gumb u donjem desnom kutu kako bi se taj Query izvršio. Query će napraviti tablicu imena VIDI_X_Data te u njoj nekoliko polja. Prvo polje ID označavamo kao integer od 6 znamenaka te mu dodajemo vrijednost AUTO_INCREMENT kako bi se uvijek automatski povećavala vrijednost za jedan, te ga postavljamo kao PRIMARY KEY što znači da njegova vrijednost mora biti unikat i ne smije biti prazna. Dalje, kreiramo polje varijabilnog sadržaja VARCHAR(30) koje smije imati dužinu 30 znakova te kreiramo nekoliko polja s dužinom od deset znakova, i na kraju određujemo polje imena reading_time koje se samo popunjava te kojemu dodjeljujemo vrijednosti TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP kako bi se popunjavalo automatski kada unesemo ostale podatke u ranije spomenuta polja.

slika-10-1024x682

10. Sada kad imate kreiranu bazu podataka, željet ćete pogledati što je u nju zapisano, a to možete pomoću ovakvog MySQL Queryja

SELECT * FROM 'VIDI_X_Data' WHERE 1;

kojeg možete izvršiti na SQL tabu. Naravno, u ovom trenutku nema ispisanih vrijednosti, no krenimo s postavljanjem VIDI X mikroračunala koje će zapisati neke vrijednosti u bazu.

 

Shema spajanja

Shema_sen-1-1024x662

Senzor spojite kao na slici, pa krenimo s učitavanjem koda.

 

Kod

Ako niste već ranije instalirali Arduino IDE, to možete učiniti uz pomoć radionice na linku: https://vidi-x.org/radionice/vidi-project-x-91-arduino-ide/.

Nakon instalacije Arduino IDE razvojnog okruženja, potrebno je instalirati biblioteke koje vam trebaju za ovaj projekt.

slika-11_library-1024x904

Bitno je odabrati dobru biblioteku s kojom će biti čim manje problema pri daljnjem razvoju koda, ali ponekada je potrebno obratiti pažnju i na zauzeće RAM-a koje može biti znatno različito između dvije biblioteke.

 

Kako bismo mogli programirati LCD ekran, potrebna nam je Adafruit ILI9341 biblioteka, koju ćete instalirati tako da u Arduino IDE razvojnom sučelju otvorite Manage Libraries (CTRL + SHIFT + I) iz izbornika Tools te u tražilicu upišete ILI9341. Ovdje možete odabrati verziju te biblioteke. Mi smo koristili verziju 1.5.12 te smo odabrali opciju instaliranja ostalih pripadajućih biblioteka kako kompajliranje koda ne bi javljalo greške.

Na isti način ćemo odabrati instalaciju pripadajućih biblioteka i za biblioteku MySQL_MariaDB_Generic verzije 1.7.2 (https://github.com/khoih-prog/MySQL_MariaDB_Generic) koja nam je potrebna za spajanje s MySQL serverom.

Prvo što ćete napraviti u kodu je promijeniti podatke za spajanje na Wi-Fi te podatke za spajanje s MySQL serverom. Svi se redom nalaze u datoteci Credentials.h.

Dakle, varijablama ssid[], pass[], server[], server_port, default_database[], default_table[], user[] i password[] dodijelite svoje lozinke, imena servera i tako redom, a server_port će vam eventualno ostati na uobičajenoj vrijednosti od 3306.

U glavnoj programskoj skici započinjemo s uključivanjem biblioteka te definiranjem varijabli, no jedna od bitnijih je predefinirani upit

char INSERT_DATA[] = "INSERT INTO %s.%s (sensor, location, value1) VALUES ('%s',%d,%s)";

 

U njemu je bitno razumjeti ova slova sa znakom postotak ispred njih, %s i %d. To nisu varijable, nego su specifikacije za format koji želimo umetnuti. Tako redom imamo

%d – za decimalni broj (decimal)
%i – za cijeli broj (integer)
%u – za broj bez predznaka (unsigned)
%s – za tekstualnu vrijednost (string)

 

Za one koji ne znaju, brojevi bez predznaka (unsigned) ne mogu biti negativni, nego kada od nule oduzmemo jedan, dobijemo najveći broj u pozitivnom rasponu. Isto tako, dodamo li na taj najveći broj jedan, rezultat će biti nula. Vrlo zgodno ih je koristiti za uštedu memorije, ali i za razne brojače kojima je cilj katkada ponovno krenuti od nule.

Vratimo se malo na upit. Za njegovo bolje razumijevanje, potrebno je posegnuti za dokumentacijom MySQL baza podataka. Osim Googlea, predlažemo posjetiti link https://www.w3schools.com/sql/. A mi smo vam u primjeru koda pripremili primjere za zapisivanje u tablicu od 3 do 5 polja. U funkciji runInsert() zaduženoj za glavninu zapisivanja, promotrite ovu liniju koda

sprintf(query, INSERT_DATA, default_database, default_table, "Distance sensor", 1, "73", sens_value, sens_value);

 

koju je potrebno razmotriti te uočiti kako ovu jedinicu zapravo ubacujemo na mjesto označeno s %d, dok ostale vrijednosti ubacujemo kao znakovni niz (string), pa ukoliko poželimo ubaciti broj, moramo ga staviti u navodnike kao u ovom primjeru za broj „73“. Drugim riječima, kada imamo brojčanu varijablu koju smo dobili od senzora, moramo je pretvoriti u niz znakova.

 

Neposredno prije sastavljanja upita, to činimo uz pomoć ovih linija koda

str = String(s);
str.toCharArray(sens_value, 10);

 

Isto tako smo mogli koristiti funkciju dtostrf() koja služi za pretvaranje decimalnih brojeva u niz znakova. Sintaksa te funkcije izgleda ovako

dtostrf(float_value, min_width, num_digits_after_decimal, where_to_store_string);

 

U našem kodu možemo ju koristiti u obliku

dtostrf(s, 1, 2, sens_value);

 

Ovih nekoliko načina konverzija vam pokazujemo kako biste lakše usvojili korak po korak što je potrebno proći s podacima da bi oni na kraju bili ispravni za unošenje u bazu. Naravno, nekada će biti zgodnije koristiti jednu, a nekada drugu varijantu konverzije, a ovisno o tome što još radite s tim varijablama, osim upisivanja u bazu.

Za kraj, valja napomenuti da je kod napisan tako da se svi podaci ispisuju na ekran VIDI X-a, pa za stvarnu implementaciju ovoga treba sakriti s ekrana ispis svih tih lozinki, jer dođe li netko do njih, izbrisat će vam bazu ili na drugi način ugroziti podatke.

Kako biste vidjeli svoje podatke, najlakše se poslužiti phpMyAdmin alatom, no možete ih i ispisati uz pomoć skriptnog jezika PHP i priložene datoteke view_data.php.

 

slika-12-1024x534

Ovako izgleda web stranica dobivena iz spomenutog koda koji ispisuje podatke iz MySQL baze.

 

Kako biste pokrenuli ovaj .php kod, potrebno je postaviti web server s mogućnošću pokretanja .php skripti. Predlažemo da posjetite https://www.infinityfree.net te se mailom registrirate za besplatan web hosting koji je zaista spor, no može pokrenuti vašu testnu .php skriptu.

Bitno je znati da taj besplatni web hosting ugasi vaš račun ukoliko ga niste posjetili 30 dana, pa oprezno s projektima na kojima želite nastaviti raditi, tj. obavezno si lokalno spremajte kopije datoteka za koje mislite da će vam sutra trebati. Isto tako, nismo koristili MySQL s tog hostinga jer on nije dostupan izvana, nego jedino putem datoteka posluživanih baš na tom serveru. A među mnogim drugima koji imaju duži ili kraći probni period, izabrali smo ovaj jer vam nije potrebna kreditna kartica za postavljanje osnovnog hosting okruženja.

Naravno, uvijek imate kao alternativu web server pokrenut na vlastitom računalu. To možete instalacijom XAMPP alata s https://www.apachefriends.org ili s nekim od njegovih alternativa. Nadamo se da ste iz ove radionice naučili ponešto o VIDI X-u i MySQL bazama.

 

Za kraj na vama ostaje

Baza podataka koja se koristi u ovom projektu je ograničena na veličinu od 5 MB, pa će se vrlo brzo popuniti te će biti potrebno povremeno ju isprazniti.

 

slika-13_za-kraj

 

Isto tako, kako bi ovo zaista postao „tihi alarm“, na serverskoj strani će biti potrebno postaviti mehanizam dojave koji će vas obavijestiti o događaju kada se nešto zapiše u bazu.

Za to postoji mnogo načina, a s kojima se nećemo baviti u ovom tutorijalu. I ne zaboravite na činjenicu da bi svaki server, pa tako i ovaj MySQL server, trebao imati redundantnu bazu za slučaj da glavna baza iz bilo kojeg razloga prestane s radom. No niti s time se nismo bavili u ovoj radionici, pa to ostavljamo vama za zadatak.

Ovaj kod ispisuje osjetljive podatke na ekran VIDI X mikroračunala, pa je potrebno maknuti ispis nepotrebnih podataka.

Osim toga, kod se izvršava sporije kada se sve to ispisuje na ekran i serijsku konzolu, pa ukoliko netko vrlo brzo protrči, ili nešto baci ispod senzora, može izbjeći detekciju. Izbacite sav ispis na serijsku konzolu i na ekran kako biste maksimalno ubrzali izvođenje programa.

 

Kompletan kod radionice pronađite na GitHubu na linku: https://github.com/VIDI-X/MySQL_Insert_Silent_Alarm

Ocijeni sadržaj
(0 glasova)

// možda će vas zanimati

Newsletter prijava


Kako izgleda naš posljednji newsletter pogledajte na ovom linku.

Copyright © by: VIDI-TO d.o.o. Sva prava pridržana.