Šiame straipsnyje aprašysiu atskirą darbą, kuriame su RPI ir Arduino bei operaciniu stiprintuvu atliekamas kintamos formos srovės ir įtampos matavimas, įvertinamas statistinis duomenų išbarstymas ir rezultatai patiekiami WEB puslapyje.
Turinys. Darbo atskiros dalys:
1. Trumpas aprašymas.
2. Davikliai
3. Struktūrinė, principinė schemos bei ploštės konstruktyvas.
4. Arduino programos diagrama ir listingas, duomenų struktūra
5. RPI C programos listingas ir paleidimo aprašymas
6. PHP, JS listingai duomenų priėmimui ir atvaizdavimui.
7. Išvados.
1. Trumpas aprašymas.
2. Davikliai
3. Struktūrinė, principinė schemos bei ploštės konstruktyvas.
4. Arduino programos diagrama ir listingas.
Duomenų struktūra
Greitaveika
Reikia atsakyti į klausimą: Kaip greit galima fiksuoti duomenis? Vienas iš išeities argumentų yra Arduino perdavimo greitis. Šiuo atveju naudojame USB to Serial chipą Arduino plokštėje CH341. Pagal Arduino manualą didžiausias perduodamas greitis yra 115200 bit/sek.. Duomenų paketas sudaro 8 reišmes atskirtas SPACE 20H simboliu ir milis() funkcijos grąžinama reikšme (integer) milisekundes. Kol kas realizuota viena iš aštuonių duomenų yra FLOAT, kitos Integer. Taigi maksimalus eilutės ilgis: 7×4(INT 0…1024) + 4(FLOAT) + 7 (20H) + milis()+ 2(ODH, OAH – eilutės pabaiga):
xxxx x.xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx OAH ODH
Dar vienas išeities argumentas yra analoginio keitiklio greitaveika. Žr. teorinius parametrus: TODO.
Sunaudojama vieta kaupiklyje, duomenų bazės įrašų kiekis
5. RPI C programos listingas ir paleidimo aprašymas
Prie RPI jungiames WiFi, putty, IP adresas: 192.168.3.95 (pi/vejojegaines), hostname sratavimas – kadangi IP adresas nėra fiksuotas, bandau su putty jungtis naudodamas hostaname vietoj IP adreso. Neveikia. TODO kodėl?. Trūksta proftpd. Instaliuojam: apt-get install proftpd. Pasiūlo atnaujinti: apt-get update. bandau dar. Padarė. Nenurodžius katalogo, sujungia šakniniame kataloge. Taisau: nuimu kompentarą DefaultRoot ~ eilutei. /etc/proftpd/proftpd.conf faile. Perstartuoju proftpd: /etc/init.d/proftpd restart
sukuriame išeities failą. pasinaudosime ankstesniu darbu ir nukopijuosime kodą iš:
http://vejas.defas.lt/wp-content/uploads/2018/02/ziogas.c
ziogas.c pervardiname failu sratavimas.c
Pakeičiam prisijungimo prie mysql duomenis:
const char *user=”sratavimas”;
const char *password=”sratavimas”;
const char *database=”sratavimas”;
kompiliavimo eilutė:
gcc -o sratavimas.o -I /usr/include/ `mysql_config --cflags --libs` sratavimas.c
Gaunu klaidą:
sratavimas.c:10:10: fatal error: mysql/mysql.h: Toks failas ar aplankas neegzistuoja
#include <mysql/mysql.h> //used by mysql
sukompiliuojam:
apt-get install mariadb-server
po šio instaliavimo konfigūruojam mysql serverį komanda:
root@sratavimas:/home/pi# mysql_secure_installation
Čia sukuriame root slaptažodį (sratavimas) ir pašaliname anonymous vartotoją, leidžiam prisijungti nuotoliniu, taisome failą: /etc/mysql/mariadb.conf.d/50-serv.cnf
#bind-address = 127.0.0.1
papildomai instaliuojame:
apt-get install libmariadb-dev
apt-get install libmariadb-dev-compat
dabar failą mysql.h randa:
/usr/include/mariadb/mysql.h
/usr/include/mariadb/server/mysql.h
Pataisome kodą sratavimas.c vietoj mysql įrašydami mariadb/mysql.h
Sukuriame duomenų bazę sratavimas, sukuriame vartotoją sratavimas, jam suteikiame teisę prie DB sratavimas:
MariaDB [(none)]> grant all on sratavimas.* to sratavimas identified by 'sratavimas';
Joje sukuriame dvi lenteles: Duomenys ir Forma. Jų struktūra:
CREATE TABLE `sratavimas`.`Duomenys` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `A0` int(10) unsigned NOT NULL COMMENT 'Srove', `A1` int(10) unsigned NOT NULL COMMENT 'Itampa', `TS` int(10) unsigned NOT NULL COMMENT 'Timestamp from Arduino', `Laikas` datetime NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2282 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `sratavimas`.`Forma` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `KreivesTaskai` varchar(6144) NOT NULL, `TS` int(10) unsigned NOT NULL, `Laikas` datetime NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4;
Dabar kompiliavimas vyksta be klaidų. pataisysiu kodą formuodamas dvi mysql insert komandas: viena kas sekundę praneša srovės ir įtampos reikšmes ir yra trumpa, kita ilga ir kas minutę perduoda įtampos ir srovės kreivių formą. Maksimalus eilutės ilgis= (4(vieno matavimo reikšmė 0…1023)+2(‘, ‘))* MAsize (const unsigned int MAsize=96; – arduino kodas)=1024*6=6144 baitų. sratavimas.c faile užknisa skaičiuoti, kiek yra raidžių eilutėje. Tam yra online priemonė: https://www.lettercount.com/
Trumpos eilutės formatas:
insert into sratavimas.Duomenys (A0, A1, TS) values (128, 0, 1006907 );
Ilgos eilutės formatas:
insert into sratavimas.Forma (KreivesTaskai, TS) values ('528, 528, 528, 529, 528, 529, 529, 529, 529, 528, 529, 529, 529, 528, 528, 528, 528, 528, 528, 527, 528, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 529, 528, 529, 528, 528, 529, 529, 529, 529, 529, 528, 528, 528, 528, 528, 528, 528, 527, 528, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528, 529, 528, 528, 529, 529, 528, 529, 529, 528, 529, ', 1005867);
taigi:
6. PHP, JS listingai duomenų priėmimui ir atvaizdavimui.
Konfigūruojame proftps, kad pasiektume katalogą /var/www/html/ kuriame leidžiamas apache2. Taisome failą /etc/proftpd/proftpd.conf:
Pagal nutylėjimą nėra suinstaliuota PHP: Instaliuojam:
apt install libapache2-mod-php apt-get install php7.3-mysql
taisome /etc/php/7.3/apache2/php.ini:
short_open_tag=on
Atsarginę SD kortelės kopiją darau su win32diskimager programa. Matomai ji kopijuoja sektoriais, ne failais, iš 16GB kortelės gavosi 15GB atvaizdo failas. Bet kompresuojasi gerai. Archyvas sudaro 4GB failą.
7. Bandymai ir išvados.