這篇介紹在 Windows IoT Core 下, Raspberry Pi 3 如何接收光敏電阻的訊號!
而光敏電阻的訊號是類比訊號,
由於 Raspberry Pi 3 沒有接收類比訊號的 pin 腳,
所以必須先將類比訊號轉成數位訊號,
那該如何做?
ADC0832 模組,它可以將類比訊號轉為數位訊號,
而在 Windows IoT Core 類別庫,也有相對應的函式庫支援,
所以使用這個模組是十分方便的,
流程簡單來說,就是 Raspberry Pi 連接 ADC0832,ADC0832 連接 Light Sensor
Raspberry Pi ←→ ADC0832 ←→ Light Sensor
先來看看 ADC0832,共 8 個腳位
腳位說明:
Pin Number | Description |
1 | CS - Chip Select (Active Low) |
2 | CH0 - Analog Input Channel 0 |
3 | CH1 - Analog Input Channel 1 |
4 | GND - Ground |
5 | DI - Data Input |
6 | DO - Data Output |
7 | CLK - Clock |
8 | Vcc - Positive Supply |
ADC0832 connect Light Sensor:
- Signal ( OUT ) → CH0
- VCC → VCC
- GND → GND
ADC0832 connect Raspberry Pi 3:
- CS → GPIO 18
- GND → GND
- DO → GPIO 24
- DI → GPIO 24 (or just connect DO and DI together)
- CLK → GPIO 23
- VCC → 3.3V
電路圖:
Windows IoT Core Library:
- 建立 AdcProviderManager 物件
- 建立 ADC0832 物件,並指定 ChipSelectPin, ClockPin, DataPin 腳位,
再加入 AdcProviderManager - 透過 adcManager.GetControllersAsync 取得 adcControllers 物件
- 建立 AnalogSensor 物件,同時設定更新頻率
- 透過 AnalogSensor ReadingChanged 事件,即可取得訊號( Value, Ratio ),
由於 ADC0832 是將類比訊號轉為 8bit 數位訊號,所以: - Value 為 0 ~ 255
- Ratio 為比例
// Create ADC manager var adcManager = new AdcProviderManager(); // Add ADC chips adcManager.Providers.Add( new ADC0832() { ChipSelectPin = gpioController.OpenPin(18), ClockPin = gpioController.OpenPin(23), DataPin = gpioController.OpenPin(24), } ); // Get the well-known controller collection back var adcControllers = await adcManager.GetControllersAsync(); // Create light sensor var lightSensor1 = new AnalogSensor() { AdcChannel = adcControllers[0].OpenChannel(0), ReportInterval = 250, }; // Subscribe to events lightSensor1.ReadingChanged += LightSensor1_ReadingChanged;
AnalogSensor ReadingChanged event:
private async void LightSensor1_ReadingChanged(IAnalogSensor sender, AnalogSensorReadingChangedEventArgs args) { // Invert var ratio = 1 - args.Reading.Ratio; var value = args.Reading.Value; // Update UI await Dispatcher.RunIdleAsync((s) => { // do something }); }
AnalogSensorReading 定義:
public sealed class AnalogSensorReading : IAnalogSensorReadingClass { public AnalogSensorReading(int val, double ratio); public double Ratio { get; } public double Value { get; } }
DEMO: