Hardware | Programování | Pojďme programovat elektroniku

Pojďme programovat elektroniku: Vyzkoušíme ultrazvukový dálkoměr, detektor pohybu, deště a další kouzla

  • Vyzkoušíme si senzory na pokročilých sběrnicích
  • Budeme ultrazvukem měřit vzdálenost
  • Detekujeme déšť i pohyb

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.

936000244 936606421
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í.

591645038 698325436
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.

555207153
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!

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,