Сообщение
BATONS » Вс июл 08, 2012 9:10 am
Код для Arduino
/*
Код мониторинга электропотребления и трансляции
данных на сервер majordomo
настроены коэфф под эту прошиву 5 июля 2012г
Схема подключения:
* LCD RS пин к цифр. выходу 12
* LCD Enable пин к цифр. выходу 11
* LCD R/W к Общему
* LCD VO пин (пин 3) к ШИМ-выходу 9
* LCD D4 пин к цифр. выходу 5
* LCD D5 пин к цифр. выходу 4
* LCD D6 пин к цифр. выходу 3
* LCD D7 пин к цифр. выходу 2
*/
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0x00, 0x2A, 0xF6, 0x12, 0x69, 0xDU }; // MAC-адрес устройства
byte ip[] = { 192, 168, 8, 10 }; // ip-адрес устройства
byte server[] = { 192, 168, 8, 3 }; // IP компьютера на котором установлен сервер majordomo
byte gateway[] = { 192, 168, 8, 1 };
byte subnet[] = { 255, 255, 255, 0 };
char buf[80];
Client rclient(server, 80); // 80-порт
// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest()
{
//Serial.println(buf);
if (rclient.connect())
{
//Serial.println("OK");
rclient.println(buf);
rclient.println("Host: 192.168.8.3"); // IP компьютера на котором установлен сервер majordomo
rclient.println();
delay(2000);
rclient.stop();
}
}
int numberOfSamples = 3000;
//Установка датчиков тока и напряжения
int inPinV = 0;
int inPinI = 1;
//*************************************************************************
// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором
double VCAL = 27.00; // для напряжения
double ICAL = 2.21; // для тока
double PHASECAL = 2.3; // для мощности
//*************************************************************************
double V_RATIO = 50.5 / 1024 * VCAL;
double I_RATIO = (long double) 15.15 * 5 / 1024 * ICAL;
//Образцы переменных
int lastSampleV,lastSampleI,sampleV,sampleI;
//Переменные для фильтров
double lastFilteredV, lastFilteredI, filteredV, filteredI;
double filterTemp;
//Сюда сохраняем калибровочное значение фазы мгновенного напряжения
double shiftedV;
//Расчет переменной для мощности
double sqI,sqV,instP,sumI,sumV,sumP;
//Полезные значения переменных
double realPower,
apparentPower,
apparentPower1,
powerFactor,
Vrms,
Irms;
// подключаем библиотеку дисплея:
#include <LiquidCrystal.h>
// инициализация библиотеки с перечнем задействованных выводов
LiquidCrystal lcd (8, 7, 6, 5, 3, 2);
void setup ()
{
Ethernet.begin(mac, ip, gateway, subnet); // Инициализируем Ethernet Shield
// устанавливаем ШИМ выход (регулируем контрастность дисплея):
pinMode (9, OUTPUT);
analogWrite (9, 70);
// устанавливаем кол-во столбцов и строк:
lcd.begin (16, 4);
lcd.print(" POWER MONITOR");
}
void loop ()
{
//Serial.println(temp);
for (int n=0; n<numberOfSamples; n++) // цикл крутится 3000 раз
{
//Используется для удаления смещения 2,5в
lastSampleV=sampleV;
lastSampleI=sampleI;
//Читаем с пинов текущее значение U и I
sampleV = analogRead(inPinV);
sampleI = analogRead(inPinI);
// Используется для удаления смещения 2,5в
lastFilteredV = filteredV;
lastFilteredI = filteredI;
//Цифровой фильтр для удаления постоянного смещения 2,5 в
filteredV = 0.996*(lastFilteredV+sampleV-lastSampleV);
filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);
//Тут калибруем фазу
shiftedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);
//Среднеквадратический метод расчета напряжения
//1) square voltage values
sqV= filteredV * filteredV;
//2) Суммируем
sumV += sqV;
// Среднеквадратический метод расчета тока
//1) square current values
sqI = filteredI * filteredI;
//2) Суммируем
sumI += sqI;
//Мгновенная мощность
instP = shiftedV * filteredI;
//Суммируем
sumP +=instP;
}
//Расчет корня из среднего напряжения и тока (rms)
Vrms = V_RATIO*sqrt(sumV / numberOfSamples);
Irms = I_RATIO*sqrt(sumI / numberOfSamples);
//Расчет величины мощности
//realPower = V_RATIO*I_RATIO*sumP / numberOfSamples;
apparentPower = (Vrms * Irms)/1000; // значение в Киловатах
apparentPower1 = (Vrms * Irms); // значение в Ваттах
powerFactor = realPower / apparentPower;
//Сброс накопленных значений
sumV = 0;
sumI = 0;
sumP = 0;
// устанавливаем курсор в 0-ом столбце, 1 строка (начинается с 0):
lcd.setCursor (0, 1);
lcd.print ("U=");
lcd.setCursor (2, 1);
lcd.print (Vrms);
lcd.setCursor (9, 1);
lcd.print ("I=");
lcd.setCursor (11, 1);
lcd.print (Irms);
//lcd.print(sampleI);
lcd.setCursor (0, 2);
lcd.print ("P=");
lcd.setCursor (2, 2);
lcd.print(apparentPower);
lcd.setCursor (6, 2);
lcd.print ("kW");
delay(333);
// отправляем значения на сервер majordomo
//значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (int)Vrms, abs(Vrms));
//sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%d HTTP/1.0", Vrms);
sendHTTPRequest();
//значение тока
sprintf(buf, "GET /objects/?object=sensorAmper&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (int)Irms, abs(Irms));
sendHTTPRequest();
//значение мощности
sprintf(buf, "GET /objects/?object=sensorVatt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (int)apparentPower1, abs(apparentPower1));
sendHTTPRequest();
//delay(3000);
}
Последний раз редактировалось
BATONS Вс июл 08, 2012 9:41 am, всего редактировалось 1 раз.
- За это сообщение автора BATONS поблагодарил:
- Serega66 (Пт май 04, 2018 8:12 am)