Đọc cảm biến ánh sáng bằng ADC

Đọc cảm biến ánh sáng bằng ADC

Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu cách sử dụng module cảm biến ánh sáng để điều khiển vòng LED RGB sáng khi trời tối và ngược lại, tắt khi trời sáng.

Linh kiện cần dùng

Chức năng linh kiện

Module cảm biến ánh sáng này hoạt dựa vào sự thay đổi của cường độ của ánh sáng môi trường. Nếu trời tối thì cường độ ánh sáng yếu, điện trở của cảm biến ánh sáng trên module tăng lên và ngược lại, nếu cường độ ánh sáng tăng thì điện trở của cảm biến ánh sáng sẽ giảm.

Kết nối các linh kiện

  • Bảng kết nối UnoX với cảm biến ánh sáng
UnoXCảm biến ánh sáng
Chân 3V3Chân VCC
Chân GNDChân GND
Chân A0Chân D0
  • Bảng kết nối UnoX với vòng LED RGB
UnoXVòng LED RGB
Chân 5VChân 5V
Chân GNDChân GND
Chân 12Chân DI

Ý tưởng xây dựng chương trình

  • Chúng ta sẽ đọc cường độ sáng của môi trường bằng cảm biến ánh sáng.
  • Dựa vào cường độ ánh sáng thực tế theo quan sát của mắt để cài đặt ngưỡng sáng hoặc tối.
  • Dựa vào ngưỡng cài đặt này, nếu là ngưỡng tối thì sẽ điêù khiển vòng LED chạy 1 hiệu ứng nào đó.

Source Code

Mô tả

Souce code này sẽ nhận tín hiệu từ cảm biến trả về qua chân A0 trên UnoX, nếu kết quả trả về lớn hơn giá trị threshold = 600 thì vòng LED sẽ chạy hiệu ứng coloWipe

Cài đặt thư viện

Tải và cài đặt thư viện AdafruitNeoPixel để điều khiển các hiệu ứng cho vòng LED RGB. Đường dẫn thư viện ![AdafruitNeoPixel](https://github.com/adafruit/Adafruit_NeoPixel)

Chương trình

#include "Adafruit_NeoPixel.h"

#define PIN_LED_RING 12    // Chân DIN của vòng LED
#define NUMS_LED     12    // Số lượng LED ở vòng LED RGB
#define pinAnaLight  A0    // Chân kết nối với A0 của cảm biến ánh sáng
#define threshold    650   // Ngưỡng so sánh.

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMS_LED, PIN_LED_RING, NEO_GRB + NEO_KHZ800);
// Adafruit_NeoPixel(Số lượng LED, Chân DIN, Tần số hoạt động)
void setup()
{
  Serial.begin(115200);             // Khởi tạo giao tiếp serial
  Serial.println("Initial serial");
  strip.begin();                    // Khởi tạo Neo pixel
  strip.setBrightness(30);          // Cài đặt mức độ sáng
  strip.show();                     // Hàm để hiển thị vòng LED
}

void loop()
{
  unsigned int AnalogValue;
  AnalogValue = analogRead(pinAnaLight);     // Đọc giá trị analog từ chân A0
  Serial.println(AnalogValue);
  if (AnalogValue < threshold) {             // Nếu giá trị analog < 650 thì đèn tắt
    strip.show();
    colorWipe(strip.Color(0, 0, 0), 50);     // Cài đặt giá trị LED tắt RED = 0, GREEN = 0, BLUE = 0, delay = 30ms
    Serial.println("The light is turn off"); // In ra serial
  } else {
    colorWipe(strip.Color(0, 255, 255), 30);
    colorWipe(strip.Color(100, 255, 0), 30);
    colorWipe(strip.Color(0, 0, 255), 30);
    strip.show();
    Serial.println("The light is turn on");
  }
  delay(100);
}

  // Hàm chạy hiệu ứng khi trời tối.
void colorWipe(unsigned int c, unsigned int wait)
{
    for (int i = 0; i < strip.numPixels(); i++) { // numPixels là số lượng LED
      strip.setPixelColor(i, c); // Cài đặt màu cho từng LED
      strip.show();
      delay(wait);
    }
}

Kết quả

Khi cảm biến ánh sáng xuất ra giá trị lớn hơn giá trị ngưỡng đã cài đặt (tương ứng với ánh sáng yếu) thì vòng LED sẽ tự động sáng và chạy hiệu ứng.