Всем привет. Хочу поделится одним из проектом созданным на базе Arduino.
Для меня работа с токовыми датчиками GY-712 была впервые. Перед созданием этого проекта создавался тестовый блок.
Если вам уже интересно, тогда продолжим.
Здесь я расскажу об одном модуле, так как описывать и зарисовывать 7 модулей не очень-то и легко.
Было тех задание:
1) Лампы(фонари) 50-65ВТ 220В переменка или 24В постоянка;
2) Индикация работы лампы (светодиод на панели);
3) Звуковая индикация перегоревшей лампы.
Решение было принято такое:
Используем токовый датчик GY-712 5А
По причинам:
1) Меряет переменный и постоянный ток;
2) Легко подключается к контроллеру;
3) Компактный;
4) Недорогой при заказе с Китая.
Давайте посмотрим на схему:
Как работает программа.
При старте он проверяется, включен ли тумблер, если включен ты выдается звуковой сигнал и световая индикация, что бы датчик можно было откалибровать без нагрузки. Если тумблер выключить то прога выдаст звук + индикация.
Далее идет калибровка. После калибровки – звуковой сигнал.
И стартует основная программа. Контроль тумблера, если включен то контроль тока нагрузки лампы, если ток выше заданного порога то включить индикацию если тока нет, то выключить индикацию и выдать звуковой сигнал.
Вот простая схема без контроля тумблера, просто световая индикация. Это на тот случай кому просто нужен будет световой индикатор нагрузки – но тогда можно просто намотать на ферритовое кольцо провода(сделать трансформатор тока) и подключить светодиодик.
Фото тестов:
Видео теста:
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