Další kapitola, další cesta do minulosti. Inženýři z Philips Semiconductor v roce 1982 navrhli sběrnici I²C, která dokázala propojit počítač s hromadou zařízení podobně jako 1-Wire s předchozí kapitoly. I²C je už ale mnohem pokročilejší a rychlejší rozhraní, potřebuje tedy dva signální vodiče: datový SDA a synchronizační SCL. Senzor, který komunikuje skrze I²C, má proto typicky čtyři vývody: napětí (VIN), zem (GND), SDA a SCL.
Pokud na signální piny SDA a SCL napojíte v sérii hromadu senzorů a dalších zařízení, které komunikují na této sběrnici, musí je mikropočítač nějak identifikovat. K tomu slouží 7bitová adresa (číslo 0 až 127). Když chce tedy mikropočítač komunikovat jen s jedním zařízením, pošle sice signál skrze sběrnici I²C do všech připojených zařízení, ale odpoví mu pouze to se správnou adresou.
Mikropočítače mají na desce buď dedikované piny SDA a SCL, anebo pro ně slouží některé z A/D pinů. Na Arduino Uno to je A4 (SDA) a A5 (SCL) a pro práci s touto sběrnicí se používá knihovna Wire.
Maličký tlakoměr, vlhkoměr a teploměr v jednom
Jestli se naprostý začátečník nevyzná ve sběrnici 1-Wire, pak bude I²C ještě mnohem větší oříšek a to i při použití knihovny Wire. Naštěstí i zde mají často konkrétní zařízení vlastní knihovnu a platí to i o barometru BME280, který seženete na eBay aspol. v mnoha laciných kopiích za cenu okolo stokoruny.
Miniaturní digitální senzor BME280 v různých podobách
Senzor obsahuje barometr a pomocné teplotní a vlhkostní čidlo, které vnitřní čip používá k výpočetním korekcím. Suma sumárum tedy tento malý integrovaný obvod o velikosti micro SD spočítá atmosférický tlak, relativní vlhkost vzduchu, teplotu vzduchu a ještě nadmořskou výšku.
Na internetu se potuluje hned několik populárních knihoven pro různé varianty meteočipu. Ty laciné za stovku z eBaye a s rozhraním I²C budou fungovat třeba s touto od cactus.io (v případě komplikací je třeba vygooglit jinou).
Kód je díky použití obou knihoven opět naprosto jednoduchý. Na začátku programu jsem musel stanovit adresu barometrického čidla. Zpravidla se jedná o hodnotu 0x76 nebo 0x77, nicméně si s využitím knihovny Wire si můžete napsat i tento jednoduchý vyhledávač, který projde jednu možnou adresu za druhou a vypíše ty, na kterých ve vašem případě odpovídá nějaké zařízení.
Připojení barometru pomocí I2C na desce Arduino Uno, kde lze pro spoje SDA a SCL použít piny A5 a A4. Když se však dobře podíváte, uvidíte, že má deska i vlastní dedikované piny pro SDA a SCL vpravo nahoře pod červeným tlačítkem RESET.
Tak a teď už pouze stačí vše nastartovat a díky knihovně a jejím metodám v časové smyčce opět periodicky číst hodnotu tlaku v milibarech, relativní vlhkost vzduchu v procentech, teplotu ve stupních a případně i výšku, kterou lze spočítat z rozdílu mezi aktuálním tlakem a typickým tlakem při hladině moře.
A konečně výstup programu opět skrze sériovou linku do připojeného počítače
Kód programu
Nakonec opět kód celého projektu, který je stále jednoduchý, protože obsahuje dvě rozměrné knihovny. To se podepíše i na velikosti celého programu, který už v tomto případě citelně zaplní paměť Arduina. Na to je třeba pamatovat a knihovny používat pouze tam, kde je to opravdu třeba.
#include <Wire.h>
#include <cactus_io_BME280_I2C.h>
// Barometr je na adrese 0x76
BME280_I2C bme(0x76);
void setup() {
// Nastav seriovou linku
Serial.begin(9600);
while(!Serial){;}
Serial.println("*** Ukazka digitalniho barometru BME280 ***");
// Nastartuj senzor BME280
bme.begin();
bme.setTempCal(-1);
Serial.println("Tlak [hPa]\tVlhkost [%]\tTeplota [stC]");
}
void loop() {
// Precti data ze senzoru BME280
bme.readSensor();
// Ziskej a vypis tlak v milibarech (hPa)
Serial.print(bme.getPressure_MB()); Serial.print("\t\t");
// Ziskej a vypis relativni vlhkost v %
Serial.print(bme.getHumidity()); Serial.print("\t\t");
// Ziskej a vypis teplotu ve stupnich Celsia
Serial.println(bme.getTemperature_C());
// Pockej deset sekund a vse opakuj
delay(10000);
}
Takže to máme základní demonstraci analogového a digitálního čidla a sofistikovanějšího barometru. Teď se pojďme podívat na další – bizarní detektor dešťových kapek. Bude opět analogový, takže to bude jednoduché. Šup do další kapitoly!