Arduino Pro Mini + токовый датчик GY-712 ведут контроль перегорания ламп

в 14:14, , рубрики: 5A, arduino, diy или сделай сам, GY-712, mini, PRO, uno, датчик тока, контроль

Всем привет. Хочу поделится одним из проектом созданным на базе Arduino.
Для меня работа с токовыми датчиками GY-712 была впервые. Перед созданием этого проекта создавался тестовый блок.

image

Если вам уже интересно, тогда продолжим.

Здесь я расскажу об одном модуле, так как описывать и зарисовывать 7 модулей не очень-то и легко.

Было тех задание:
1) Лампы(фонари) 50-65ВТ 220В переменка или 24В постоянка;
2) Индикация работы лампы (светодиод на панели);
3) Звуковая индикация перегоревшей лампы.

Решение было принято такое:
Используем токовый датчик GY-712 5А

image

По причинам:
1) Меряет переменный и постоянный ток;
2) Легко подключается к контроллеру;
3) Компактный;
4) Недорогой при заказе с Китая.

Давайте посмотрим на схему:

image

Как работает программа.

При старте он проверяется, включен ли тумблер, если включен ты выдается звуковой сигнал и световая индикация, что бы датчик можно было откалибровать без нагрузки. Если тумблер выключить то прога выдаст звук + индикация.
Далее идет калибровка. После калибровки – звуковой сигнал.

И стартует основная программа. Контроль тумблера, если включен то контроль тока нагрузки лампы, если ток выше заданного порога то включить индикацию если тока нет, то выключить индикацию и выдать звуковой сигнал.

Вот простая схема без контроля тумблера, просто световая индикация. Это на тот случай кому просто нужен будет световой индикатор нагрузки – но тогда можно просто намотать на ферритовое кольцо провода(сделать трансформатор тока) и подключить светодиодик.

image

Фото тестов:

image

image

image

Видео теста:

Пример программы для одного модуля. IDE 1.5.2

float srab = 0.650;

const int currentPin1 = 0; // Аналоговый вход с датчика тока

const unsigned long sampleTime = 100000UL; // sample over 100ms, it is an exact number of cycles for both 50Hz and 60Hz mains
const unsigned long numSamples = 250UL; // choose the number of samples to divide sampleTime exactly, but low enough for the ADC to keep up
const unsigned long sampleInterval = sampleTime/numSamples; // the sampling interval, must be longer than then ADC conversion time
//const int adc_zero = 512; // relative digital zero of the arudino input from ACS712 (could make this a variable and auto-adjust it)
int adc_zero1; //Переменная автоматической калибровки

float first;

void setup()
{
pinMode(13, OUTPUT);// Пин индикатора
pinMode(12, OUTPUT); // пин звука
pinMode(2, INPUT); // пин входа реле (тумблер)

digitalWrite(13, LOW);
digitalWrite(12, LOW);

while(digitalRead(2)==0 ) { // Если включен тумблер то выдать звуковой и световой сиглак пока не отключат для возможности калибровки
tone(12,2000,500);
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}

tone(12,1500,100); // Звук старта калибровки
delay(180);
tone(12,1500,100);
delay(180);
tone(12,1500,100);

//Serial.begin(9600);
adc_zero1 = determineVQ(currentPin1); //Quiscent output voltage — the average voltage ACS712 shows with no load (0 A)
digitalWrite(13, HIGH);
tone(12,1000,100);

delay(150);
digitalWrite(13, LOW);

}

void loop(){
// Serial.print(«ACS712@A2_1:»);Serial.print(readCurrent(currentPin1,adc_zero1),3);Serial.println(" mA");
delay(300);

if(digitalRead(2)==0){ // Если включен тумблер то:
if (readCurrent(currentPin1,adc_zero1)> srab) // Если ток больше указанного порга сработки то:
{
digitalWrite(13, HIGH); // Включить индикатор

}
else // Иначе
{
if(digitalRead(2)==0){ //Если тумблер все еще включен то:
digitalWrite(13, LOW); // Погасить индикатор
tone(12,2000,500); } // и выдать звуковой сигнал
}

}
else { // Иначе
digitalWrite(13, LOW); // // Погасить индикатор
}
//-------------------------------------------------------------------------------------------------------------------------------------------------

delay(250);

}

int determineVQ(int PIN) {
//Serial.print(«estimating avg. quiscent voltage:»);
long VQ = 0;
//read 5000 samples to stabilise value
for (int i=0; i<5000; i++) {
VQ += analogRead(PIN);
delay(1);//depends on sampling (on filter capacitor), can be 1/80000 (80kHz) max.
}
VQ /= 5000;
//Serial.print(map(VQ, 0, 1023, 0, 5000));Serial.println(" mV");
return int(VQ);
}

float readCurrent(int PIN, int adc_zero0)
{
unsigned long currentAcc = 0;
unsigned int count = 0;
unsigned long prevMicros = micros() — sampleInterval;
while (count < numSamples)
{
if (micros() — prevMicros >= sampleInterval)
{
int adc_raw = analogRead(PIN) — adc_zero0;
currentAcc += (unsigned long)(adc_raw * adc_raw);
++count;
prevMicros += sampleInterval;
}
}
float rms = sqrt((float)currentAcc/(float)numSamples) * (75.7576 / 1024.0);
return rms;
//Serial.println(rms);

}

Автор: free_arduino

Источник

Поделиться

* - обязательные к заполнению поля