V předchozím článku jsme si ukázali, jak můžeme ovládat digitální výstupy. Dnes budeme LED ovládat na základě vstupů ze senzorů. Senzorů je nepřeberné množství a můžete s nimi komunikovat různými způsoby. Asi nejjednodušším senzorem je tlačítko, které se připojí na digitální pin. Použití senzorů, konkrétně infračerveného dálkoměru, si ukážeme na jednoduchém příkladu parkovacího „radaru“.
LED zapojíme stejně, jako v předchozím článku na digitální piny.
Dálkoměr se připojuje pomocí tří vodičů – zem (GND), napájení (5V) a signál (A0). Na vybraném analogovém pinu budeme číst napětí, které odpovídá vzdálenosti. V našem případě vyšší hodnota znamená bližší předmět. Průběh napětí není lineární a je závislý na typu senzoru. Potřebné informace najdete v katalogovém listu příslušného senzoru. Nejjednodušším řešením, když nepotřebujete získávat přesné hodnoty nebo hodnotu přepočítanou na měřenou veličinu, je určit hranice, na které budete reagovat, experimentálně. Prostě a jednoduše nastavíte senzor do vzdálenosti, kdy chcete zhasnout zelenou LED (místa dost) a rozsvítit žlutou LED (opatrně), a přímo přečtete hodnotu ze senzoru, kterou si uložíme. To samé uděláme pro hranici žlutá LED – červená LED. Tím, že budeme používat přímo hodnotu ze senzoru a nebudeme ji dále přepočítávat, také ušetříme systémové zdroje, kterých je na těchto malých procesorech nedostatek. Je třeba si také uvědomit, že analogový vstup poskytuje informaci v určitém rozsahu, typicky 0 = 0 V, 1023 = 5 V. Tento rozsah můžete změnit.
Nezapomeňte přidat referenci na GHIElectronics.NETMF.Hardware, kde najdete objekt AnalogIn.
public static void Main()
{
OutputPort ledRed = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di0, false);
OutputPort ledYellow = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di1, false);
OutputPort ledGreen = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di2, false);
AnalogIn distanceSensor = new AnalogIn(AnalogIn.Pin.Ain0);
int distance = 0;
while (true)
ledRed.Write(false);
ledYellow.Write(false);
ledGreen.Write(false);
// načte hodnotu, rozmezí 0 - 1023
distance = distanceSensor.Read();
// 20 cm, 416, červená
// 60 cm, 100, žlutá
if (distance <= 100)
ledGreen.Write(true);
}
else if (distance > 100 && distance <= 416)
ledYellow.Write(true);
else
ledRed.Write(true);
// Počkáme na další měření
Thread.Sleep(250);
Štěpán