[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