[PRZYKŁAD] Usługa SMS powiadamiająca o nadmiernym stężeniu gazu – Orange Pi 2G-IOT oraz modMQ-5
Po zmontowaniu układu można przejść do kodu programu. Na początek inicjalizowane są wszystkie biblioteki, definiowana stała MODEM_PATH (ścieżka dostępu do modemu) oraz definiowane są stałe: mojNumer (numer telefonu, na który zostanie wysłana wiadomość) oraz tekst (treść wiadomości). W tym miejscu też inicjalizowana jest zmienna fd – numer deskryptora połączenia z modemem.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <termios.h> #include <wiringPi.h> #include <stdbool.h> #define MODEM_PATH "/dev/modem0" const char* mojNumer= "000000000; const char* tekst = "Poziom gazu przekroczyl dopuszczalny poziom"; int fd;
Jak wcześniej wspomniano, z pliku przykładowego pożyczono trzy funkcje: Send_AT – wysyła komendy AT do modemu, serial_init – inicjalizuje połączenie z modułem GPS oraz display_message – wyświetla komunikaty wchodzące i wychodzące z modułu GSM.
void serial_init(int fd)
{
struct termios options;
tcgetattr(fd, &options);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~CRTSCTS;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_iflag |= IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
tcsetattr(fd, TCSANOW, &options);
}
void display_message(int direction, const char *message)
{
if (direction) {
printf("Send Message ------> %s\n", MODEM_PATH);
printf(">> %s\n", message);
} else {
printf("Rece Message <------ %s\n", MODEM_PATH);
printf("<< %s\n", message);
}
}
void Send_AT(int fd, const char *str1, const char *str2, const char *str3)
{
char buff[128];
char answer[128];
memset(buff, 0, sizeof(buff));
if (str1 != NULL)
strcpy(buff, str1);
if (str2 != NULL)
strcat(buff, str2);
if (str3 != NULL)
strcat(buff, str3);
write(fd, buff, strlen(buff));
display_message(1, buff);
memset(answer, 0, sizeof(answer));
sleep(1);
read(fd, answer, sizeof(answer));
display_message(0, answer);
}
Funkcja SendSMS ma za zadanie wysłać dwie komendy AT, które powodują wysłanie wiadomości SMS w przypadku wykrycia nadmiernego stężenia gazu. Znak 0x1A to znak odpowiadający kombinacji <CTRL-Z>. Po wysłaniu wiadomości funkcja sleep blokuje przyrząd na 15 minut. Zapobiega to sytuacji, w której stężenie jest na granicy sygnalizacji, i niewielkie zmiany wyzwalają układ, przez co dochodziło by do wysyłania wielu wiadomości. To kosztuje, a przecież wystarczy jeden SMS, żeby powiadomić użytkownika o zaistniałej sytuacji.
void sendSMS(void) {
Send_AT(fd, "AT +CMGS=",mojNumer,"\r");
Send_AT(fd, tekst, "\x1A", NULL);
sleep (900); // blokada dzialania aplikacji na 15 minut
}
W funkcji main uruchamiana jest biblioteka WiringPi, a pin 1 ustawiany jako wejściowy. Następnie uruchamiany jest deskryptor modemu i on też jest inicjalizowany. Wysyłane są komendy mające na celu wstępne skonfigurowanie połączenia z siecią GSM. W pętli głównej co 5 sekund sprawdzany jest czy stan na linii 1 nie zmienił się na niski. Gdy tak się stanie, wysyłany jest SMS pod podany w kodzie numer.
int main(int argc, char *argv[]) {
bool flag;
if (wiringPiSetup () < 0) {
printf ("Nie mozna otworzyc biblioteki WiringPi\n");
return 1;
}
system ("gpio mode 1 in");
pinMode(1,INPUT);
fd = open(MODEM_PATH, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < 0) {
printf("Nie mozna utworzyc polaczenia z modemem %s\n", MODEM_PATH);
return -1;
}
serial_init(fd);
Send_AT(fd, "AT\r", NULL, NULL);
Send_AT(fd, "AT +CFUN=", "1", "\r");
sleep (20); // czeka na ustabilizowanie polaczenia z siecia GSM
Send_AT(fd, "AT+CGMF=", "1", "\r");
while(1) {
if (digitalRead(1) != flag){
if (flag == true)
sendSMS();
flag = !flag;
}
sleep(5);
}
close(fd); return 0;
}
Po wgraniu pliku z programem do pamięci Orange Pi, należy przejść do folderu z plikiem i skompilować go następującym poleceniem:
gcc -Wall -o przyklad_modMQ-5_OrangePi_2G-IOT przyklad_modMQ-5_OrangePi_2G-IOT.c -lwiringPi
A nastepnie uruchomić poniższym:
./przyklad_modMQ-5_OrangePi_2G-IOT
Przykład działania programu można obejrzeć na materiale wideo:
Program można wyłączyć kombinacją <CTRL-C>. Aby wyłączyć komputer można wywołać polecenie:
shutdown now

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



