bài viết này mình sẽ giới thiệu về Dự án: Tự động kiểm soát cường độ ánh sáng đường phố bằng Arduino
Dự án: Tự động kiểm soát cường độ ánh sáng đường phố bằng Arduino
Trong dự án này, tôi sẽ chỉ cho bạn cách thiết kế và xây dựng một mạch
đơn giản nhưng hiệu quả được gọi là Điều khiển cường độ tự động của đèn
đường bằng Arduino.Vì khái niệm của dự án này là tiêu thụ năng lượng,
sử dụng đèn LED làm Đèn đường sẽ là lựa chọn hiển nhiên.
Mục lục
•Giới thiệu
•Điều khiển cường độ tự động của đèn đường bằng Arduino là gì?
•Khái niệm đằng sau Điều khiển cường độ tự động của đèn đường bằng Arduino
•Sơ đồ mạch
•Thành phần bắt buộc
oThiết kế mạch
•Mã
•Đang làm việc
•Phần kết luận
Giới thiệu
Ngày xưa, đèn đường trên đường được điều khiển bằng tay. Tuy nhiên,
ngày nay đèn đường được điều khiển tự động hoặc bằng công nghệ tự động hóa mới nổi.
Nhưng người ta có thể nhận thấy rằng không cần thiết phải sử dụng cường độ cao
vào những giờ cao điểm, đó là khi không có giao thông và thậm chí vào buổi sáng.
Bằng cách giảm cường độ ánh sáng bằng đèn LED, năng lượng có thể được tiết kiệm.
Bài viết này thảo luận về việc thiết kế bộ điều khiển cường độ tự động của đèn
đường sử dụng các bộ phận điện và điện tử đơn giản như đèn LED, bộ vi điều khiển,
hoạt động và mục đích cũng như các ứng dụng của dự án này.
Điều khiển cường độ tự động của đèn đường bằng Arduino là gì?
Tự động điều khiển cường độ đèn đường là một dự án đơn giản trong đó cường độ của
đèn đường được điều khiển tự động dựa trên điều kiện ánh sáng mặt trời.
Nói chung, đèn đường được bật vào buổi tối và sẽ tiếp tục sáng cho đến sáng.
Điều này có thể dẫn đến việc sử dụng năng lượng không cần thiết vì đèn sẽ
luôn phát sáng ở cường độ tối đa. Nhưng bằng cách sử dụng Điều khiển
cường độ tự động của đèn đường bằng dự án Arduino, bạn có thể kiểm soát
cường độ dựa trên điều kiện ánh sáng xung quanh.
Như một tính năng tiết kiệm điện bổ sung, tôi đã sử dụng đèn LED cho đèn đường.
Khái niệm đằng sau Điều khiển cường độ tự động của đèn đường bằng Arduino
Trước khi đi vào sơ đồ mạch, các thành phần và mã, tôi muốn nói một chút về
ý tưởng đằng sau dự án Điều khiển cường độ tự động của đèn đường bằng
Arduino. Tôi sẽ không so sánh nó với bất kỳ dự án nào khác mà chỉ đi sâu vào khái niệm.
Tôi đã sử dụng kết hợp Mô-đun RTC (DS3231) và LDR để điều khiển đèn đường.
Sự kết hợp này không phải là một cái gì đó mới mẻ mà là cách nó được thực hiện.
Về cơ bản, có hai chế độ hoạt động của dự án này: Chế độ RTC và Chế độ LDR.
Ở Chế độ RTC, đèn đường tự động bật dựa trên Thời gian BẬT được đặt trong mã và tắt
dựa trên Thời gian TẮT.Trong Chế độ LDR, đèn đường có điều khiển cường độ dựa
trên ánh sáng xung quanh gần LDR.
Sơ đồ mạch
Hình ảnh sau đây cho thấy sơ đồ mạch của Điều khiển cường độ tự động của đèn đường
sử dụng dự án Arduino.
Thành phần bắt buộc
• Arduino UNO
• Mô-đun RTC DS3231
• LDR
• Màn hình LCD 16 × 2
• Đèn LED
• Chiết áp 10KΩ
• Điện trở 10KΩ
• Nút ấn
• Kết nối dây
• Breadboard
Thiết kế mạch
Đầu tiên kết nối các chân SDA và SCL của DS3231 RTC Module với các chân A4 (SDA)
và A5 (SCL) của Arduino. Điện trở 10KΩ và LDR được kết nối theo định dạng bộ chia
điện áp và đầu ra của nó được cấp cho chân A3 (của Arduino).
Các chân dữ liệu của Module LCD 16 × 2 tức là D4 - D7 được kết nối tương ứng
với các chân 6, 5, 4 và 3 của Arduino. Các chân RS và E được kết nối với các chân 8 và 7.
Dưới đây là đoạn code
# include < Wire.h >
# include < LiquidCrystal.h >
# bao gồm " RTClib.h "
# xác định BẬT 0
# xác định TẮT 1
DateTime bây giờ;
RTC_DS3231 rtc;
Màn hình LCD LiquidCrystal ( 8 , 7 , 6 , 5 , 4 , 3 ); // (rs, e, d4, d5, d6, d7)
const int buttonPin = 2 ;
const int led = 11 ;
int nob = A3;
int val = 0 ;
int val1 = 0 ;
int đường dẫn = 1 ;
int a = 1 ;
int beforeState = HIGH;
unsigned int trước đóPress ;
int buttonFlag dễ bay hơi ;
int buttonDebounce = 20 ;
int on_hour = 1 ;
int on_minute = 1 ;
int on_second = 10 ;
int off_hour = 23 ;
int off_minute = 57 ;
int off_second = 10 ;
int c_hour = 0 ;
int c_minute = 0 ;
int c_second = 0 ;
int onOrOffFlag = ON;
void showDate ( vô hiệu );
void showTime ( void );
void showDay ( void );
void loadHandler ( int , int , int , int , int , int , int , int , int );
typedef struct userTime
{
int temp_hour;
int temp_minute;
int temp_second;
} userTime_t;
unsigned char checkLessThanOrEqual (userTime_t, userTime_t);
void setup ()
{
Nối tiếp. bắt đầu ( 9600 );
màn hình LCD. bắt đầu ( 16 , 2 );
pinMode (buttonPin, INPUT_PULLUP);
pinMode (led, OUTPUT);
mountInterrupt ( digitalPinToInterrupt (buttonPin), button_ISR, CHANGE);
if (! rtc. begin ())
{
Nối tiếp. println ( " Không thể tìm thấy Mô-đun RTC " );
trong khi ( 1 );
}
if (rtc. lostPower ())
{
Nối tiếp. println ( " RTC bị mất nguồn, hãy đặt thời gian! " );
rtc. điều chỉnh ( DateTime ( F (__DATE__), F (__TIME__)));
}
rtc. điều chỉnh ( DateTime ( F (__DATE__), F (__TIME__)));
}
void loop ()
{
nếu (đường dẫn)
{
if (a == 1 )
{
màn hình LCD. setCursor ( 0 , 0 );
màn hình LCD. print ( " RTC " );
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " CHẾ ĐỘ BẬT " );
chậm trễ ( 2000 );
a = 0 ;
}
bây giờ = rtc. ngay ();
showTime ();
c_hour = bây giờ. giờ ();
c_minute = bây giờ. phút ();
c_second = bây giờ. thứ hai ();
loadHandler (on_hour, on_minute, on_second, off_hour, off_minute, off_second, c_hour, c_minute, c_second);
chậm trễ ( 1000 );
}
khác
{
if (a == 0 )
{
màn hình LCD. setCursor ( 0 , 0 );
màn hình LCD. print ( " LDR " );
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " CHẾ ĐỘ BẬT " );
chậm trễ ( 2000 );
a = 1 ;
}
val = analogRead (nob);
if (val> 300 && val < 450 )
{
màn hình LCD. setCursor ( 0 , 0 );
màn hình LCD. print ( " 30% " );
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " Độ sáng " );
analogWrite (dẫn, 400 );
}
khác nếu (val> 450 && val < 550 )
{
màn hình LCD. setCursor ( 0 , 0 );
màn hình LCD. print ( " 60% " );
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " Độ sáng " );
analogWrite (dẫn, 600 );
}
khác nếu (val> 550 && val < 600 )
{
màn hình LCD. setCursor ( 0 , 0 );
màn hình LCD. print ( " 100% " ) ;;
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " Độ sáng " );
analogWrite (đã dẫn, 1023 );
}
khác nếu (val < 300 )
{
màn hình LCD. setCursor ( 0 , 0 );
màn hình LCD. print ( " 0% " );
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " Độ sáng " );
analogWrite (dẫn, 0 );
}
}
}
void showTime ()
{
màn hình LCD. setCursor ( 0 , 0 );
màn hình LCD. print ( " Thoi gian: " );
màn hình LCD. print (ngay. giờ ());
màn hình LCD. print ( ' : ' );
màn hình LCD. print (ngay. phút ());
màn hình LCD. print ( ' : ' );
màn hình LCD. print (ngay. giây ());
màn hình LCD. print ( " " );
}
void button_ISR ()
{
buttonFlag = 1 ;
if (( millis () - beforePress)> buttonDebounce && buttonFlag)
{
trước đóPress = millis ();
if ( digitalRead (buttonPin) == LOW && beforeState == HIGH)
{
đường dẫn =! con đường;
beforeState = LOW;
}
else if ( digitalRead (buttonPin) == HIGH && beforeState == LOW)
{
beforeState = CAO;
}
buttonFlag = 0 ;
}
}
unsigned char checkLessThanOrEqual (userTime_t a, userTime_t b)
{
if (a. temp_hour
trả về true ;
khác
{
if ((a. temp_hour == b. temp_hour ) && (a. temp_minute
{
trả về true ;
}
khác
{
if (a. temp_hour > b. temp_hour )
trả về sai ;
khác
{
if ((a. temp_minute == b. temp_minute ) && (a. temp_second
{
trả về true ;
}
khác
{
if (a. temp_minute > b. temp_minute )
trả về sai ;
khác
{
if (a. temp_second == b. temp_second )
{
trả về true ;
}
khác
{
trả về sai ;
}
}
}
}
}
}
}
void loadHandler ( int onTimeHr, int onTimeMin, int onTimeSec, int offTimeHr, int offTimeMin, int offTimeSec, int rtcTimeHr, int rtcTimeMin, int rtcTimeSec)
{
userTime_t in1 = {onTimeHr, onTimeMin, onTimeSec}, in2 = {offTimeHr, offTimeMin, offTimeSec}, rtc_hr = {rtcTimeHr, rtcTimeMin, rtcTimeSec}, a = {}, b = {};
if ( checkLessThanOrEqual (in1, in2))
{
onOrOffFlag = BẬT;
memcpy (& a, & in1, sizeof (userTime_t));
memcpy (& b, & in2, sizeof (userTime_t));
}
khác
{
onOrOffFlag = TẮT;
memcpy (& a, & in2, sizeof (userTime_t));
memcpy (& b, & in1, sizeof (userTime_t));
}
if (( checkLessThanOrEqual (a, rtc_hr)) && ( checkLessThanOrEqual (rtc_hr, b)))
{
if (onOrOffFlag == ON)
{
// Bật tải
digitalWrite (dẫn, CAO);
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " Thời gian tắt: " );
màn hình LCD. print (off_hour);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (off_minute);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (off_second);
}
khác
{
// Tắt tải
digitalWrite (dẫn đầu, THẤP);
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " OnTime: " );
màn hình LCD. print (on_hour);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (on_minute);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (on_second);
}
}
khác
{
if (onOrOffFlag == ON)
{
// Tắt tải
digitalWrite (dẫn đầu, THẤP);
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " OnTime: " );
màn hình LCD. print (on_hour);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (on_minute);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (on_second);
}
khác
{
// Bật tải
digitalWrite (dẫn, CAO);
màn hình LCD. setCursor ( 0 , 1 );
màn hình LCD. print ( " Thời gian tắt: " );
màn hình LCD. print (off_hour);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (off_minute);
màn hình LCD. print ( ' : ' );
màn hình LCD. print (off_second);
}
}
}
if ((a. temp_hour == b. temp_hour) && (a. temp_minute
{
trả về đúng sự thật;
}
khác
{
if (a. temp_hour> b. temp_hour)
bad return;
khác
{
if ((a. temp_minute == b. temp_minute) && (a. temp_second
{
trả về đúng sự thật;
}
khác
{
if (a. temp_minute> b. temp_minute)
bad return;
khác
{
if (a. temp_second == b. temp_second)
{
trả về đúng sự thật;
}
khác
{
bad return;
}
}
}
}
}
}
}
void loadHandler (int onTimeHr, int onTimeMin, int onTimeSec, int offTimeHr, int offTimeMin, int offTimeSec, int rtcTimeHr, int rtcTimeMin, int rtcTimeSec)
{
userTime_t in1 = {onTimeHr, onTimeMin, onTimeSec}, in2 = {offTimeHr, offTimeMin, offTimeSec}, rtc_hr = {rtcTimeHr, rtcTimeMin, rtcTimeSec}, a = {}, b = {};
if (checkLessThanOrEqual (in1, in2))
{
onOrOffFlag = BẬT;
memcpy (& a, & in1, sizeof (userTime_t));
memcpy (& b, & in2, sizeof (userTime_t));
}
khác
{
onOrOffFlag = TẮT;
memcpy (& a, & in2, sizeof (userTime_t));
memcpy (& b, & in1, sizeof (userTime_t));
}
if ((checkLessThanOrEqual (a, rtc_hr)) && (checkLessThanOrEqual (rtc_hr, b)))
{
if (onOrOffFlag == ON)
{
// Bật tải
digitalWrite (path, CAO);
màn hình LCD. setCursor (0, 1);
màn hình LCD. print ("Time off:");
màn hình LCD. print (off_hour);
màn hình LCD. print (':');
màn hình LCD. print (off_minute);
màn hình LCD. print (':');
màn hình LCD. print (off_second);
}
khác
{
// Disable download
digitalWrite (đầu tiên, THẤP);
màn hình LCD. setCursor (0, 1);
màn hình LCD. print ("OnTime:");
màn hình LCD. print (on_hour);
màn hình LCD. print (':');
màn hình LCD. print (on_minute);
màn hình LCD. print (':');
màn hình LCD. print (on_second);
}
}
khác
{
if (onOrOffFlag == ON)
{
// Disable download
digitalWrite (đầu tiên, THẤP);
màn hình LCD. setCursor (0, 1);
màn hình LCD. print ("OnTime:");
màn hình LCD. print (on_hour);
màn hình LCD. print (':');
màn hình LCD. print (on_minute);
màn hình LCD. print (':');
màn hình LCD. print (on_second);
}
khác
{
// Bật tải
digitalWrite (path, CAO);
màn hình LCD. setCursor (0, 1);
màn hình LCD. print ("Time off:");
màn hình LCD. print (off_hour);
màn hình LCD. print (':');
màn hình LCD. print (off_minute);
màn hình LCD. print (':');
màn hình LCD. print (off_second);
}
}
}
Đang làm việc
Sau khi thực hiện kết nối và tải mã lên Arduino, hãy bật Nguồn cung cấp cho dự án. Ban đầu, Arduino chạy ở Chế độ RTC trong đó có hai thời điểm được đặt trong mã: THỜI GIAN BẬT và THỜI GIAN TẮT.
Arduino so sánh thời gian BẬT với thời gian từ Mô-đun RTC và khi chúng khớp với nhau, đèn LED được BẬT. Sau đó, Arduino đợi đến THỜI GIAN TẮT và khi thời gian từ Mô-đun RTC đạt đến THỜI GIAN TẮT, đèn LED sẽ TẮT.
Phần kết luận
Một dự án đơn giản để tiết kiệm điện được thực hiện bằng cách sử dụng Điều khiển cường độ tự động của đèn đường bằng Arduino. Với những sửa đổi và cải tiến nhỏ, dự án này có thể được áp dụng để sử dụng trong thời gian thực.
Hotline: 0979 466 469