جستجو
برای جستجو متن مورد نظر وارد کنید و Enter بزنید برای بستن Esc بزنید.
یکی از روشهای مرسوم برای محافظت مدارات یا وسایل الکتریکی از اتصال کوتاه استفاده ازفیوز های الکتریکی می باشند.فیوزها ابزاری ساده و مطمئن می باشند ولی عیب انها این است در صورت عبور جریان بیشتر از سقف مجاز انها می سوزند و بلااستفاده می شوند , شرایطی پیش می اید که ممکن است به مدار یا دستگاه خود بخاطر دوری مسافت دسترسی نداشته باشیم و از طرفی شرایط جریان کشی زیاد دستگاه بخاطر خطایی لحظه ای بوده و نه همیشگی. در اینجا به مداری نیاز داریم که بتوانیم از راه دور ان را کنترل کنیم و همچنین حد جریان مجاز را تنظیم کنیم.
در این پروژه ما می خواهیم توسط سنسور جریان ACS712 , میکروکنترلر و رله معمولی یک رله کنترل جریان هوشمند بسازیم تا اولا حد جریان مجاز بصورت نرم افزاری قابل تنظیم باشد و دوما بتوانیم در صورت ایجاد خطا دوباره مدار را به حالت اولیه برگردانیم.
ابتدا توضیحی در مورد سنسور ACS712 می دهیم, یک سنسور جریان اثر هال که در رنج جریان های مختلف 5 , 20 و 30 امپری در بازار موجود است که می تواند جریان های مثبت و منفی DC و AC را اندازه گیری نماید.
پایه های IP پایه های سری شده با بار برای عبور جریان می باشند که برای کاهش مقاومت پایه ها و تاب اوری در مقابل جریان زیاد هر سمت از دو پایه مشابه استفاده شده است و باید در طراحی PCB این دو پایه بهم متصل شوند.
تغذیه کاری سنسور ولتاژ 5 ولت می باشد که برای حذف نویز و دادن یک ولتاژ تمیز به پایه VCC وجود خازن نویزگیر و صافی الزامی می باشد.
پایه GND پایه زمین ای سی می باشد که باید به زمین تغذیه ما متصل شود.
پایه فیلتر برای کاهش نویز و افزایش نرخ سیگنال به نویز می باشد که ما همانند دیتاشیت از یک خازن 1 نانو فاراد استفاده می کنیم.
و پایه VIOUT که می توانیم توسط ADC میکروکنترلر تغییرات جریان را اندازه گیری نماییم.
پایه VIOUT در حالت عادی و زمانی که هیچ جریانی از سنسور نمی گذرد دارای ولتاژ پیش فرض 2.5 ولت می باشد که در عمل ممکن است این ولتاژ پایه کمی انحراف به سمت بالا یا پایین داشته باشد که شما می توانید مقدار واقعی را اندازه گیری کنید و در برنامه قرار بدهید.
در صورتی که پلاریته اتصالی پایه های IP هم جهت با جریان ورودی باشد با افزایش مقدار جریان ولتاژ پایه VIOUT از 2.5 ولت شروع به زیاد شدن می کند و در صورت اتصال معکوس پایه های IP ولتاژ از 2.5 ولت نسبت به مقدار جریان اعمالی شروع به کاهش می کند.
حساسیت مدل سنسور ACS ای که در پروژه استفاده کرده ایم 100 میلی ولت بر امپر می باشد.
شماتیک برنامه پروتئوس :
از نمایشگر کارکتری برای نمایش پیغام استفاده شده است و 3 led برای نمایش وضعیت انتظار, وضعیت نرمال و وضعیت خطا که توسط رنگ های زرد , سبز و قرمز قابل شناسایی هستند.
در صورتی که در وضعیت خطا هستیم توسط کلید Reset می توان وضعیت دستگاه را به حالت نرمال بازگرداند, توسط کلید Set می توان وارد قسمت تنظیم حد جریان مجاز شد و با فشار دادن کلیدهای up و down حد مجاز جریان را با دقت 0.5 امپر از صفر تا 20 امپر تنظیم کرد.
و با زدن دوباره کلید set میتوان از بخش تنظیمات خارج و مقادیر انتخاب شده توسط ما در حافظه EEPROM میکروکنترلر ذخیره می شود.
نکته : کلیدهای ورودی میکروکنترلر فعال به صفر هستند زیرا در حالت عادی توسط مقاومت pull up در وضعیت یک منطقی قرار گرفته اند.
همچنین از یک رله 12 ولتی که توسط ترانزیستور جریان تحریک سیم پیچ اولیه ان تامین می شود و برای محافظت از ترانزیستور در مقابل جریان برگشتی سیم پیچ از دیود هرزگرد استفاده کرده ایم.
در ادامه توضیحات برنامه را شرح می دهیم :
#include "EEPROM.h"
#include <LiquidCrystal.h>
#define rs 13
#define e 12
#define db4 11
#define db5 10
#define db6 9
#define db7 8
LiquidCrystal lcd(rs, e, db4, db5, db6, db7);
معین کردن پایه های اتصالی نمایشگر کارکتری
#define yellow 2
#define green 1
#define red 0
معین کردن های پایه های متصل شده به led ها
#define resetBtn 7
#define upBtn 6
#define downBtn 5
#define setBtn 4
و معین کردن پایه های کلیدهای ورودی
#define relay 3
پایه 3 اردوینو برای خاموش و روشن کردن رله استفاده شده است.
#define saveLocation 0
مشخص کردن ادرس مکان حافظه eeprom برای ذخیره حد جریان
#define acsMax 20
مشخص کردن حداکثر جریان عبوری از ACS
#define acsStep 0.5
تنظیم گام تغییرات جریان حد مجاز در منوی مربوطه
#define acsRef 2.5
مشخص کردن ولتاژ پایه VIOUT سنسور در حالت بدون بار
#define acsResolution 0.1
و مشخص کردن دقت سنسورacs ما که برابر با 100 میلی ولت می باشد.
#define debug 1
bool allow = true;
bool error = false;
float limit = 0.00;
void root() {
تابع نمایش پیغام صفحه روت
lcd.clear();
lcd.print(F("Smart Relay:"));
lcd.setCursor(0, 1);
}
void rowClear() {
تابع پاکسازی سطر دوم نمایشگر
lcd.setCursor(0, 1);
lcd.print(F(" "));
lcd.setCursor(0, 1);
}
void showLimit() {
تابع نمایش حد جریان تنظیم شده
rowClear();
lcd.print(limit);
lcd.setCursor(6, 1);
lcd.print(F("A"));
}
void setup() {
pinMode(relay , OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
pinMode(red, OUTPUT);
خروجی کردن پایه های رله و led
digitalWrite(yellow , HIGH);
digitalWrite(green , LOW);
digitalWrite(red , LOW);
digitalWrite(relay , LOW);
و تنظیم حالت پیش فرض انها
pinMode(resetBtn , INPUT_PULLUP);
pinMode(upBtn , INPUT_PULLUP);
pinMode(downBtn , INPUT_PULLUP);
pinMode(setBtn , INPUT_PULLUP);
قرار دادن پایه های کلیدها در وضعیت ورودی بهمراه فعال سازی مقاومت pull up داخلی
lcd.begin(2, 16);
مشخص کردن تعداد سطر و ستون نمایشگر و کانفیگ ان
root();
if (EEPROM.read(saveLocation) == 255) { //it is empty
در صورت تنظیم نبودن حد جریان پیغام زیر نمایش داده شده و متغییر allow برابر با False می شود تا قسمت کنترل رله فعال نشود تا وقتی که کاربر حد جریان را مشخص کند.
allow = false;
lcd.print(F("Not Set Current"));
}
else {
limit = EEPROM.read(saveLocation);
limit /= 10;
در غیر این صورت مقدار را خوانده و در متغییر limit قرار می دهیم.چون نمی توانیم عدد اعشاری را در eeprom ذخیره کنیم در مرحله سیو کردن عدد را ضرب در 10 می کنیم و در حالت خواندن تقسیم بر 10 می کنیم تا به مقدار صحیح برسیم.
#ifdef debug == 1
نمایش حد جریان ذخیره شده در شروع برنامه در صورتی که debug برابر با یک باشد.
lcd.clear();
lcd.print(F("Show Limit :"));
showLimit();
delay(3000);
root();
#endif
digitalWrite(relay , HIGH);
}
digitalWrite(yellow , LOW);
}
uint32_t tempTime = 0;
void loop() {
if ((allow == true) && (digitalRead(resetBtn) == LOW)) {
اگر کاربر قبلا حد جریان را تنظیم نمود و در صورت نیاز یا پیش امدن حالت خطا می تواند با زدن کلید ریست این وضعیت را پاک نماید.
digitalWrite(relay , LOW);
digitalWrite(red , LOW);
digitalWrite(green , LOW);
digitalWrite(yellow , HIGH);
rowClear();
lcd.print(F("Reset"));
delay(200);
while (digitalRead(resetBtn) == LOW);
حذف لرزش کلید و منتظر تا وقتی که کاربر کلید reset را نگه داشته است.
delay(2500);
rowClear();
error = false;
digitalWrite(yellow , LOW);
digitalWrite(relay , HIGH);
}
if (allow == true) {
اگر حد جریان تنظیم شده است این قسمت باید اجرا شود:
float data = analogRead(A0) / 204.6;
204.6 از ساده سازی عدد 5 (ولتاژ رفرنس Adc) و 1023 که دقت adc می باشد بدست امده است.در بالا مقدار ولتاژ واقعی را طبق رابطه تناسب بدست اورده ایم.
Real voltage = (Raw ADC Data * Vref ) / ADC Resolution
if (data >= acsRef) {
data = data - acsRef;
}
else {
data = acsRef - data;
}
از کم کردن ولتاژ خوانده شده از سنسور از ولتاژ پیش فرض پایه VIOUT می توانیم تغییرات جریان را بدست اوریم.
چون جهت جریان برای ما اهمیت ندارد کاری کرده ایم که مقدار اختلاف ولتاژ از رابطه بالا همواره مثبت در بیاید.
data = data / acsResolution;
از تقسیم اختلاف ولتاژ بدست امده بر دقت سنسور جریان عبوری از ان بدست می اید.
if (data > limit) {
در صورت بیشتر بودن جریان از حد تنظیم شده ما باید رله را خاموش کنیم و در حالت خطا برویم.
digitalWrite(relay , LOW);
digitalWrite(green , LOW);
digitalWrite(red , HIGH);
error = true;
rowClear();
lcd.print("Error , ");
lcd.print(data);
lcd.print(F(" A"));
delay(1500);
}
else {
if(error == false){
اگر قبلا حالت خطا پیش نیامده برنامه این قسمت باید اجرا شود.
digitalWrite(green , HIGH);
digitalWrite(red , LOW);
#ifdef debug == 1
در صورت اینکه debug برابر با یک باشد جریان مداوم از سنسور خوانده شده و روی نمایشگر نمایش داده می شود.
نکته : چون نمایش اطلاعات روی نمایشگر وقت گیر است و ممکن است در حالت ارسال دیتا به نمایشگر جریان عبوری از سنسور از حد مجاز فراتر رود و میکروکنترلر دیر واکنش و رله را قطع کند بهتر است فقط برای تست این قسمت فعال باشد.
برای غیر فعال کردن کافی است در قسمت #define مربوطه debug را برابر با صفر کنیم.
if((millis() - tempTime) > 300){
استفاده از تایمر millis برای اینکه با سرعت اهسته تر اطلاعات روی نمایشگر چاپ شود.در اینجا هر 300 میلی ثانیه اطلاعات جدید روی نمایشگر چاپ می شود اگر این تاخیر لحاظ نشود بعلت سرعت بالای میکروکنترلر نمایشگر هنگ می کند.
rowClear();
lcd.print(data);
lcd.print(F(" A"));
tempTime = millis();
}
#endif
}
}
}
if (digitalRead(setBtn) == LOW) {
برای ورود به منوی تنظیمات باید کلید Set را فشار دهیم
digitalWrite(relay , LOW);
digitalWrite(yellow , HIGH);
digitalWrite(green , LOW);
digitalWrite(red , LOW);
delay(250);
while (digitalRead(setBtn) == LOW);
lcd.clear();
lcd.print(F("Set Current:"));
lcd.setCursor(0, 1);
showLimit();
و سپس با زدن کلیدهای بالا و پایین حد جریان مجاز را تنظیم کنیم.
while (digitalRead(setBtn) == HIGH) {
برای خروج از منو می توان مجددا کلید Set را فشار داد.
if (digitalRead(upBtn) == LOW) {
delay(250);
while (digitalRead(setBtn) == LOW);
limit += acsStep;
if (limit > acsMax) {
limit = acsMax;
}
showLimit();
}
if (digitalRead(downBtn) == LOW) {
delay(250);
while (digitalRead(downBtn) == LOW);
if (limit >= acsStep) {
limit -= acsStep;
}
showLimit();
}
}
int temp = limit * 10;
EEPROM.update(saveLocation , temp);
ذخیره مقدار انتخاب شده در حافظه.
delay(250);
while (digitalRead(setBtn) == LOW);
rowClear();
digitalWrite(yellow , LOW);
error = false;
digitalWrite(relay , HIGH);
و سپس برگشت به حالت اولیه.
}
}
همان طور که ملاحظه می کنید با قطعات کمی توانستیم یک رله هوشمند جریان بسازیم که شما می توانید با فکر کردن و خلاقیت خود ان را توسعه دهید, مثلا با اضافه کردن یک ماژول ساعت و تاریخ می توان کاری کرد تا رله در زمان های خاصی در طول روز فعال شود و یا اینکه با اضافه کردن ماژول GSM توسط پیامک به کاربر حالت خطا و جریان خوانده شده اطلاع داده شود.
شما می توانید فایل برنامه و فایل شبیه سازی را از لینک زیر دانلود نمایید: