OK

Při poskytování služeb nám pomáhají soubory cookie. Používáním našich služeb vyjadřujete souhlas s naším používáním souborů cookie. Více informací

Úvodní stránka » GSM » Jak jednoduše na GSM-X.díl - GPRS a Thingspeak

Jak jednoduše na GSM-X.díl - GPRS a Thingspeak

Jubilejní 10. díl bude věnovaný problematice GPRS a názorně si předvedeme, jak se datová komunikace GPRS používá a samozřejmě si ukážeme vše na praktickém příkladu. Základní výbavou by Vám měl být náš Arduino GSM Shield, teploměr DS18B20 a rovněž si nezapomeňte aktualizovat knihovnu AGS, do které byly GPRS funkcionality zapracovány, k dispozici na Git hub repozitory zde. Nechci čtenáře zatěžovat zdlouhavou teorií kolem GPRS, ostatně těch je na netu celkem řada, pokusím se objasnit, jak se GPRS nejčastěji používá při výměnách dat mezi zařízením a datbázi, případně něčím, co má na starost řízení následných procesů, v několika krátkých bodech. Zařízení = machine, to co něco řídí a sbírá data = machine, u operátorů naleznete několik různých tarifů SIM karet, které jsou právě stavěny na komunikaci machine to machine, neboli M2M. Pojďme se podívat, jak nejčastěji vypadá interakce:

  • Zařízení sbírá nějaké hodnoty, měří teploty, tlaky apod., to vše pak využívá k řízení svých procesů nebo je potřeba tato data někde předat
  • Existuje několik způsobů, jak data předat do databáze přes GPRS, můžeme použít buď klasický TCP/IP přístup - zde ale narážíme na potřebu mít garantovanou pevnou veřejnou IP adresu, případně lze ze zařízení odeslat email s přílohou s textovým souborem kde budou data v nějakém formátu, lze také sestavit FTP relaci na FTP server, nebo je možné menší objem dat předat tzv. HTTP GET metodou. Právě poslední možností se budeme zabývat, protože je v praxi nejčastější a po detailním průzkumu výše zmíněných metod jistě příjdete na to, proč tomu tak je. Zabíhat do podrobností je zde out of scope, jak se odborně říká :-).
  • HTTP GET je v podstatě dotaz zařízení - poslání HTTP linku s parametry, kdy právě v parametrech se skrývají nějaké užitečné hodnoty. Odpovědí pak může být pouhé prosté potvrzení typu 1 - vše bylo přijato a uloženo, 0 - nepochopil jsem formát např.
  • Pochopitelně mohou být návratovými hodnotami i třeba daleko bohatší data, která mohou třeba překonfigurovat zařízení, spustit nějaký proces apod.
  • Aniž bychom si to uvědomovali, pak s metodou http get většina z nás žije od roku 1996, kdy byl poprvé spuštěn veřejný Internet - totiž http get není nic jiného, než dotaz na stránku a její návrat - v případě internetového prohlížeče tedy volám nějaký odkaz metodou get, vrací se mi obsah stránky v html jazyce, který mi browser přeloží do podoby čitelného textu, obrázků apod. 
  • Existují vedle metody GET i jiné metody, jako je třeba POST, DELETE atd., zde ale nechci zabíhat do detailů

Thingspeak

Jak se tedy rychle a jednoduše dobrat k něčemu, co nám bude na naše GETy odpovídat a to ještě tak, aby to dávalo smysl? Řešení je jednoduché a dnes existuje na netu několik tzv. IoT portálů, které jsou zdarma a veřejně přístupné pro logování nejrůznějších hodnot. Jedním z nich je můj oblíbený Thinspeak.com. Doporučuji se s ním obeznámit, protože příklad v tomto článku jej bude využívat. Opět v několika bodech shrnu, co je třeba udělat, abychom viděli svá data na Internetu, resp. tomto portále.

  • Zaregistrujte se 
  • Klikněte na odkaz Channels
  • Klikněte na New Channel
  • Vyplňte základní údaje - stačí Name a Field label, nechte zatrhnuté políčko field1, případně zatrhněte a pojmenujte další, pokud chcete sledovat více veličin. Zatrhněte ještě políčko Make public - to aby bylo možné sledovat naměřené hodnoty - grafy veřejně
  • Klikněte na Save Channel a objeví se Vám stránka s jedním nebo více grafy (dle toho, zda jste zatrhli více fieldů). Od této chvíle je založen Váš kanál se svým Channel ID a je připraven na přijímání dat.
  • Jak data posílat do kanálu/grafu je velmi prosté, v liště horního menu u každého kanálu je poslední odkaz Data Import/Export, klikněte na něj a mrkněte na sloupec vpravo, hned první položka: Update Channel Feed - GET. Zde máte přesný formát Vaší metody GET, kterou budete používat
  • Zkuste si tento link zkopírovat, vložte jej do browseru a pak se mrkněte, co se událo na grafu - měli by jste vidět, že se provedl zápis nějaké hodnoty, kterou jste zadali do paramteru field1=xx odkazu. Zkuste změnit tuto hodnotu a odešlete browserem. Sledujte, co Vám browser vrací - přesně totéž pak budeme přijímat v příkladu. Jak to celé funguje je myslím naprosto zřejmé.
  • Zde je malá ukázka mého feedu - teplota měřená DS18B20 a přenášená co 10 minut - tento graf si lze vyexportovat na své stránky přesně tak, jak jsem to udělal nyní.

Snad úvod do problematiky HTTP GET s přípravou praktického "podhoubí" bude stačit, jinak doporučuji si portál Thingspeak opravdu dokonale prolézt, je tam nepřeberné množství možností, co s daty dělat a je to celé zdarma!

GPRS u českých operátorů

V ČR je služba GPRS dostupná snad ve všech koutech naši nádherné vlasti a pro účely občasného přenosu pár informací je jako dělaná. Přesně zapadá do konceptu IoT, ačkoliv u GSM se asi nikdy nevyhneme nutnosti napájení na rozdíl od jiných přístupů, které jsem popsal třeba zde. Nejvhodnější se jeví pro tyto účely tzv. M2M tarify, které operátoří nabízejí, ovšem to je jen zdánlivé. Daleko lepší jsou malinké datové tarify u alternativních operátorů, které vyjdou měsíčně na 45,-Kč s objemem dat 50MB. Když začnete trochu počítat, kolik HTTP GET spotřebuje tam a zpět na komunikaci, pak zjistíte, že těch 50M bude stačit i na on-line přenos, tedy řekněme odeslání dat každých 5 sekund ad absurdum. Konkrétně mluvím o službě tohoto operátora. Za tyto peníze se jeví, že se nevyplatí dělat jakékoliv jiné řízení čehokoliv jinak než přes GPRS. Což je pravda.

Každý český operátor (alternativci jedou na sítích O2, VODAFONE nebo T-mobile) používá tzv. APN pro sestavení GPRS nebo obecně datové komunikace. O2 a VODAFONE jej mají APN = internet, T-mobile má APN = internet.t-mobile.cz. Všichni naši operátoři pak jednou bez dalších parametrů, tedy username a password, na rozdíl od třeba Rakušáků, kteří tyto parametry používají. V knihovně jsem napsal jednoduchou inicializační sekvenci pomocí funkce GPRSInit(), jejímž vstupním parametrem je pro český trh příslušné APN.

Sám používám GPRS ve svých mnoha projektech a mohu zodpovědně prohlásit, že stabilnější síť s takovýmto rozsahem neexistuje a pravděpodobně existovat nebude. Nezbývá, než si přát, aby GPRS bylo stále podporováno, protože sice není problém jet přes 3G nebo LTE - moduly na to jsou, ale jsou příšerně drahé jednak a jednak proč mít pro 100byte propustnost 20Mb/s?

Sketch

Připravil jsem velmi jednoduchý sketch, který ve své smyčce měří teplotu a sleduje čas do odeslání dat na Thingspeak.com pomocí linku vygenerovaného při založení kanálu metodou GET. Kromě teploměru DS18B20 budete tedy potřebovat samozřejmě shield AGS a aktualizovanou knihovnu AGS.

Sketch používá navíc ještě knihovnu TimerOne, kterou stáhnete zde. Použití této knihovny je velmi prosté a vše je pěkně vidět v mém sketchi. Nejprve jsem ji inicioval pro přerušení v intervalu 1 sekundy (1000000ms) a pak ji asocioval vektor přerušení. Ve vektoru přerušení (funkce timeCounter) pak není nic jiného, než proměnná u které provádím inkrement. V hlavní smyčce pak tuto proměnnou sleduji a porovnávám s konstatnou PERIODE, ve které jsem si nastavil četnost odesílání dat na Thingspeak, v tomto případě 600 sekund, nebo-li 10 minut.

Obsluha teploměru je pak z valné části realizovaná tak, jak jsme si již popsali v 8. díle tohoto seriálu. Pro jednoduchost i zde používám jeden teploměr, není problém rozšíření o další teploměry a pak můžete jedním GETem krmit další a další grafy na Vašem kanále. 

Z aktualizované knihovny AGS jsem pak využil dvě funkce, GPRSInit, která provede inicializaci GPRS - zde upozorňuji, že je třeba mít na SIMce povolena data, což je logické a ve sketchi si nezapomeňte zakomentovat nebo odkomentovat příslušné APN dle operátora Vaši SIM. U alternativců musíte vědět, přes kterou síť jede. Dále jsem doplnil funkci sendDataGPRS(), jejímž vstupem je HTTP GET link a výstupem pak data, která po GET příjdou od protistrany. Jak vidno, není to nic složitého ani z hlediska naprogramování.

Protože návratová data u některých služeb, aplikací mohou být poměrně rozsáhlá, pak doporučuji na toto alokovat dostatečné prostředky - zejména tedy zvětšit buffer SoftwareSerial!

V případě tohoto příkladu ignoruji data, která se mi vracejí z Thingspeak portálu (jde jen o inkrementální hodnotu počtu zápisu na portál), pouze s výjimkou toho, když se komunikace nepodaří - to pak funkce sendDataGPRS pošle COMMUNICATION FAILURE a na to reaguji restartem modulu SIM800 a znovu attachementem GPRS.

Tak tedy, zde je sketch v celé jeho podobě, patřičné komentáře jsou myslím docela zřejmé a můžete si jej stáhnout opět z mého Git hub repository zde. Nezapomeňte si jen aktualizovat své api_key!!! Mnou uvedený link v examplu je fiktivní, nefungující! Nepoužívejte celý link https://...., pouze api.thingspeak.com...., SIM800 nemá implementovanou podporu pro HTTPS GET!

Důležité upozornění, pro správnou funkci knihovny je potřeba zvětšit přijímací buffer knihovny SoftwareSerial a to v head file SoftwareSerial.h a to u proměnné size _SS_MAX_RX_BUFF, doporučuji nastavit buffer na alespoň 128 byte. Je třeba si uvědomit, že SIM800 na nás třeba při příjmu sms vysype jistě více, než 64 byte, které jsou nastaveny v SoftwareSerial po instalaci Arduino IDE

#include <TimerOne.h>
#include <ArduinotechGSMShield.h>
#include <SoftwareSerial.h>
#include <OneWire.h> 
#include <DallasTemperature.h>
#define LED 7
#define PERIODE 600

//definice OneWire pro připojení DS18B20
#define ONE_WIRE_BUS 10
#define TEMPERATURE_PRECISION 9 

//definice pro teploměr
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer;
float teplota;
String termIN;

//Vytvoření instance třídy AGS

AGS modul(1);
uint8_t infoStatus;
String number;
bool notificationSent;
bool afterReset;
uint32_t ticker;
//T-mobil
String APN = "internet.t-mobile.cz";
//O2 a VODAFONE
//String APN = "internet";
String thingSpeak = 
"api.thingspeak.com/update?api_key=54DLXE3I1PETR61C&field1="; //Vstupní parametry a inicializace shieldu void setup() {  pinMode(RELE1, OUTPUT);  digitalWrite(RELE1, LOW);  pinMode(LED, OUTPUT);  digitalWrite(LED, LOW);  modul.begin();  modul.GPRSInit(APN);  notificationSent = true;  digitalWrite(LED, HIGH);  //teploměr  sensors.begin();  if (sensors.getDeviceCount()>0) Serial.println F("Teplomer nalezen!");  else Serial.println F("Teplomer NENALEZEN!!!");  oneWire.reset_search();  oneWire.search(insideThermometer);  //nastav rozliseni  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);  sensors.requestTemperatures();  printAddress(insideThermometer);  printTemperature(insideThermometer);  Serial.println F("****************************************");  while (Serial.available() > 0) Serial.read();  //inicializuj timer  ticker = 0;  Timer1.initialize(1000000);  Timer1.attachInterrupt(timeCounter);  //první pokus o komunikaci  sensors.requestTemperatures();  teplota = sensors.getTempC(insideThermometer);  Serial.println(thingSpeak + String(teplota,1));  sendGET(thingSpeak + String(teplota, 0));  while (Serial.available() > 0) Serial.read();   } /*Hlavní smyčka – změří teplotu a pak ji přes HTTP GETGPRS prezentuje
do kanálu Thingspeak.com s tímto data
feed update:GET
api.thingspeak.com/update?api_key=xxxxxx&field1=xx
xx = teplota
*/ void loop() {  //měř periodicky teplotu  sensors.requestTemperatures();  teplota = sensors.getTempC(insideThermometer);  //odešli každou hodinu data  if (ticker > PERIODE)  {    ticker = 0;    sendGET(thingSpeak + String(teplota,1));  }  delay(500); } void sendGET(String get) {  if (modul.sendDataGPRS(get) != "COMMUNICATION FAILURE")  {    Serial.println F("Data ulozena");  }  //nepodařilo se zakomunikovat, opakuj za 10s  //inicializuj modul  else  {    Serial.println F("Chyba komunikace, restart ...");    ticker = PERIODE - 10;    modul.SIM800Init();    modul.GPRSInit(APN);  } } //pro teploměr void printAddress(DeviceAddress deviceAddress) {  Serial.print F("Adresa teplomeru:");  for (uint8_t i = 0; i < 8; i++)  {    // zero pad the address if necessary    if (deviceAddress[i] < 16) Serial.print("0");    Serial.print(deviceAddress[i], HEX);  }  Serial.println(""); } void printTemperature(DeviceAddress deviceAddress) {  float tempC = sensors.getTempC(deviceAddress);  Serial.print F("Teplota: ");  Serial.print(tempC);  Serial.write(176);  Serial.println("C"); } //časovač void timeCounter() {  ticker++; }

Věřím, že úvod do GPRS bude pro Vás nyní o trochu jednodušší a příležitostně mi můžete poslat odkaz na Vaše veřejné kanály. Knihovnu budu ještě dopracovávat, zejména, co se GPRS reconnectu týče, teď jsem šel opravdu jen cestou nejnižšího odporu a chtěl splnit slib, který jsme dal ohledně popisu GPRS s mým shieldem. Těší mně Váš zájem o tento shield, v přípravě je miniaturizovaná verze s integrovaným Arduino NANO, (ne na ARDUINO NANO, ale modulek se tak bude tvářit), ve výbavě bude i GPSka, takže příští rok se máte na co těšit. 

Další díly seriálu momentálně neplánuji, netvrdím, že tímto dílem to zakončím, to rozhodně ne, ale spíše budu sepisovat dle Vašich reakcí, o co bude zájem. Své aktivity zase na chvilku přesouvám do oblasti IoT, LoRa, NodeMCU, tam se toho děje opravdu mnoho, takže GSM/GPRS je sice fajn, ale jsou i jiné technologie, které stojí za pozornost. 

PF

Přidat komentář

Zvýrazněné položky jsou povinné.

Přehled komentářů

  1. Ethernet shield (Martin L., 15.1.2016 19:36:43) Odpovědět

    Lze současně s AGS připojit eth shield. Asi se budou muset přeházet pinouty?


TOP produkty

Arduino MEGA2560

Arduino MEGA2560
424 Kč s DPH

Arduinotech GSM shield

Arduinotech GSM shield
877 Kč s DPH

Kontakt

Ing. Petr Foltýn
Kunčice pod Ondřejníkem 814, 73913
TOPlist