Jak jednoduše na GSM-VIII.díl - Hlídáme teplotu s AGS
V tomto dílu si ukážeme, jak můžeme s Arduino GSM Shieldem (AGS) hlídat teplotu a dle potřeby např. spustit ventilátor nebo klimatizační jednotku, přičemž o každé aktivitě budeme notifikování SMSkou. Níže uvedený sketch využívá digitálního teploměru DS18B20 a funguje tak, že při překročení teploty 30°C sepne relé 1 - zde může být připojen na jeho spínací kontakty ventilátor. Ventilátor odventiluje teplo a relé 1 odpojí ventilátor při dosažení 24°C. Tyto meze jsem nastavil natvrdo a je možné je pochopitelně změnit - zavedením nějakých konstatnt nebo definic. Je zapracována také určitá hystereze a logika pro odeílání SMS a zapínání/vypínání ventilátoru.
O aktuální teplotě se pak můžete dozvědět odesláním SMS na číslo GSM shieldu s obsahem Teplota?, vrátí se Vám SMS s obsahem Teplota: xx.x st.C.
Připojení teploměru k AGS
Čidlo DS18B20 velmi rád používám ve svých příkladech, takže čtenářům pročítajícím i jiné rubriky je dobře známo. Na níže uvedeném obrázku je detail, kam a jak přesně čidlo zasunout do AGS. Jak již bylo zmíněno v V.dílu, je pro OneWire sběrnici, kterou DS18B20 využívá, vyveden pin D10 a je ošetřen pull up rezistorem 4k7, takže je možné DS18B20 připojit bez jakýchkoliv úprav. Pochopitelně můžete připojit i několik DS18B20 na tuto jednu sběrnici. Pro zjednodušení jsem vypracoval sketch, který bude pracovat pouze s jedním čidlem. Obsluha dvou čidel je zřejmá třeba z mého příkladu miniweb serveru.
Sketch AGS s DS1820
Sketch obsahuje potřebné komentáře a je ke stažení na mém GitHub repository zde. Před nahráním sketche udělejte jen malou úpravu - do SERVICE_NUMBER vepište své číslo mobilu, jinak bude SMSka chodit mi a ne Vám :-). Díky!
Ve sketchi využívám pochopitelně knihovnu ArduinotechGSMShield popsanou v minulém dílu, kde je velmi jednoduchý příklad jejího použití.
#include <ArduinotechGSMShield.h>
#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define LED 7
#define VENTILATOR 8
#define SERVICE_NUMBER "739822476"
//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;
//Vstupní parametry a inicializace shieldu
void setup()
{
pinMode(VENTILATOR, OUTPUT);
digitalWrite(VENTILATOR, LOW);
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
modul.begin();
notificationSent = true;
//teploměr
sensors.begin();
if (sensors.getDeviceCount()>0) Serial.println("Teplomer nalezen!");
else Serial.println("Teplomer NENALEZEN!!!");
oneWire.reset_search();
oneWire.search(insideThermometer);
//nastav rozliseni
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.requestTemperatures();
printAddress(insideThermometer);
printTemperature(insideThermometer);
Serial.println("****************************************");
}
//Hlavní smyčka – čeká na příchod SMS s obsahem Teplota?
//Jakmile je taková SMS rozpoznána, změří se teplota a odešle
//se SMSka s obsahem Teplota:xx.x st.C
//Smyčka hlídá překročení teploty (zde pevně 30 st.), jakmile
//je teplota překročená, odešle se SMS, zapne se ventilátor
//pokud se teplota vrátí pod 25 st., vypne se ventilátor
//Ventilátor = RELE1 na D8
void loop()
{
//měř periodicky teplotu
sensors.requestTemperatures();
teplota = sensors.getTempC(insideThermometer);
infoStatus = modul.checkCallAndSMS();
if (infoStatus == 2)
{
number = modul.getNumber();
Serial.println("SMS from:" + number);
if (modul.getSMSContent() == "Teplota?")
{
modul.sendSMS(number,"Teplota=" + String(teplota) + " st.C");
}
}
//zkontroluj teplotu a je-li vyšší než 30 st., pak pošli SMS
//nastav příznak, že SMS byla poslána, ať nechodí furt dookola
//zapni ventilátor
//vychozi stav odpovídá poslané SMS notification=true - kdyby
//bylo vychozí false, po resetu by se hned odeslala SMSka pokud by teplota
//byla v normálu
if ((teplota > 30.0)&&(notificationSent == false))
{
modul.sendSMS(SERVICE_NUMBER, "Pozor, teplota byla prekrocena!!!");
notificationSent = true;
Serial.println("Teplota prekrocena!!! Odeslana SMS.");
digitalWrite(VENTILATOR, HIGH);
Serial.println("Ventilator byl zapnut");
}
//vypni ventilator
if ((teplota < 24.0) && (notificationSent == false))
{
modul.sendSMS(SERVICE_NUMBER, "Teplota v normalu");
notificationSent = true;
digitalWrite(VENTILATOR, LOW);
Serial.println("Ventilator byl vypnut");
}
//smaž příznak odeslané SMSky, jakmile se teplota přiblíží
//k hranici sepnutí ventiátoru
if ((teplota > 29.0)&&(teplota < 30.0))
{
notificationSent = false;
}
//pokud je teplota vyšší jak 35 st. na nic nečekej
//a zapni ventilátor - ošetření stavu po restartu
if (teplota > 35.0) digitalWrite(VENTILATOR, HIGH);
delay(1000);
}
//pro teploměr
void printAddress(DeviceAddress deviceAddress)
{
Serial.print("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("Teplota: ");
Serial.print(tempC);
Serial.write(176);
Serial.println("C");
}
Jo a příště tedy nějaké ty examply s voláním a SMSkováním - spíše to asi navážu na tento díl a rozpracujeme inteligenci hlavní smyčky. Mrkneme taky na to, k čemu jsou na AGS vyvedeny piny pro display nebo obecně I2C sběrnice včetně napájení. Modulů pro integraci na I2C je celkem moře, kouknu do šuplíku, co mi tam kloudného lenoší a stálo by za pozornost, možná nějaké RTC, možná meteočidlo BMP180, když tak si napište, co by jste rádi s tímto shieldem pořešili.
PF