LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

[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