Код прошивки Arduino
Модератор: immortal
-
- Сообщения: 107
- Зарегистрирован: Сб июн 30, 2012 7:54 am
- Благодарил (а): 0
- Поблагодарили: 14 раз
Код прошивки Arduino
Коллеги, добрый день!
Интересует такой вопрос в коде прошивки ардуино:
я имею ввиду код, разработанный автором: http://smartliving.ru/Main/ArduinoCode
как мне получить значения передаваемые ардуино от датчика GARAGE GATES SENSOR
вот строка из кода:
sprintf(buf, "GET /objects/?object=sensorGarage&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_garage);
sendHTTPRequest();
как будет выглядеть код в Methods/Events для этой строчки?
из описания http://smartliving.ru/Main/ScMonitorHeating для температурных датчиков код такой:
/$params['t']
$old_temp=$this->getProperty('temp');
$t=round($params['t']*2)/2;
$this->setProperty('temp',$t);
if ($t>$old_temp) {
$d=1;
} elseif ($t<$old_temp) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
для этого кода, как я понял строка в ардуино своя, и отличается от строк для сенсоров дверей
вот эта строка:
sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp1));
sendHTTPRequest();
Что мне нужно изменит в коде в Methods/Events? или его можно указать так же и для датчика GARAGE GATES SENSOR?
Интересует такой вопрос в коде прошивки ардуино:
я имею ввиду код, разработанный автором: http://smartliving.ru/Main/ArduinoCode
как мне получить значения передаваемые ардуино от датчика GARAGE GATES SENSOR
вот строка из кода:
sprintf(buf, "GET /objects/?object=sensorGarage&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_garage);
sendHTTPRequest();
как будет выглядеть код в Methods/Events для этой строчки?
из описания http://smartliving.ru/Main/ScMonitorHeating для температурных датчиков код такой:
/$params['t']
$old_temp=$this->getProperty('temp');
$t=round($params['t']*2)/2;
$this->setProperty('temp',$t);
if ($t>$old_temp) {
$d=1;
} elseif ($t<$old_temp) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
для этого кода, как я понял строка в ардуино своя, и отличается от строк для сенсоров дверей
вот эта строка:
sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp1));
sendHTTPRequest();
Что мне нужно изменит в коде в Methods/Events? или его можно указать так же и для датчика GARAGE GATES SENSOR?
-
- Сообщения: 867
- Зарегистрирован: Вт янв 17, 2012 12:31 pm
- Благодарил (а): 121 раз
- Поблагодарили: 78 раз
Re: Код прошивки Arduino
BATONS писал(а):Коллеги, добрый день!
Интересует такой вопрос в коде прошивки ардуино:
я имею ввиду код, разработанный автором: http://smartliving.ru/Main/ArduinoCode
как мне получить значения передаваемые ардуино от датчика GARAGE GATES SENSOR
вот строка из кода:
sprintf(buf, "GET /objects/?object=sensorGarage&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_garage);
sendHTTPRequest();
как будет выглядеть код в Methods/Events для этой строчки?
из описания http://smartliving.ru/Main/ScMonitorHeating для температурных датчиков код такой:
/$params['t']
$old_temp=$this->getProperty('temp');
$t=round($params['t']*2)/2;
$this->setProperty('temp',$t);
if ($t>$old_temp) {
$d=1;
} elseif ($t<$old_temp) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
для этого кода, как я понял строка в ардуино своя, и отличается от строк для сенсоров дверей
вот эта строка:
sprintf(buf, "GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d HTTP/1.0", (int)current_temp2, abs(temp1));
sendHTTPRequest();
Что мне нужно изменит в коде в Methods/Events? или его можно указать так же и для датчика GARAGE GATES SENSOR?
строка в коде arduino для датчика гаража правильно указали..
sprintf(buf, "GET /objects/?object=sensorGarage&op=m&m=statusChanged&status=%i HTTP/1.0", (int)current_garage);
данная строка меняет статус объекта "sensorGarage"
настройка самого метода (т.е. код и остальные свойства) можете попробовать сделать как в примере на странице
http://smartliving.ru/Main/ScMonitorContact
возникнут вопросы, пишите, разберемся вместе
-
- Сообщения: 107
- Зарегистрирован: Сб июн 30, 2012 7:54 am
- Благодарил (а): 0
- Поблагодарили: 14 раз
Re: Код прошивки Arduino
Спасибо за инфо.
С датчиками открытия дверей я разобрался.
В данный момент на ардуино я сделал так называемый "Power Monitor" с помощью датчика тока (трансформатор тока) и датчика напряжения (понижающий трансформатор) я замеряю напряжение и потребляемый ток в квартире, все это, плюс мощность выводится у меня на LCD дисплей.
Теперь, когда увидел этот замечательный проект, решил вывести эти показатели (ток, напряжение, мощность) на сервер majordomo
Вот пой код ардуино. (это замер среднеквадратичных значений переменного напряжения и потребляемого тока).
Добавил в свой код, код приведенный на сайте и вот что у меня получилось. (код этот на железе пока не тестировал!)
точнее код рабочий и выводит все показания на дисплей. а вот передачу данных на сервер еще не пробовал
/*
Код мониторинга электропотребления и трансляции
данных на сервер majordomo
Схема подключения:
* 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, 0xFC }; // MAC-адрес устройства
byte ip[] = { 192, 168, 8, 10 }; // ip-адрес устройства
byte server[] = { 192, 168, 8, 26 }; // IP компьютера на котором установлен сервер majordomo
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.26"); // IP компьютера на котором установлен сервер majordomo
rclient.println();
delay(2000);
rclient.stop();
}
else
{
Serial.println("FAILED");
}
}
int numberOfSamples = 3000;
//Установка датчиков тока и напряжения
int inPinV = 0;
int inPinI = 1;
//*************************************************************************
// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором (амперметром и вольтметром)
double VCAL = 14.30; // для напряжения
double ICAL = 2.51; // для тока
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,
powerFactor,
Vrms,
Irms;
// подключаем библиотеку дисплея:
#include <LiquidCrystal.h>
// инициализация библиотеки с перечнем задействованных выводов
LiquidCrystal lcd (8, 7, 6, 5, 3, 2);
void setup ()
{
Ethernet.begin(mac, ip); // Инициализируем Ethernet Shield
// устанавливаем ШИМ выход (регулируем контрастность дисплея):
pinMode (9, OUTPUT);
analogWrite (9, 70);
// устанавливаем кол-во столбцов и строк:
lcd.begin (16, 4);
lcd.print(" POWER MONITOR");
}
void loop ()
{
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; // значение в киловатах
powerFactor = realPower / apparentPower;
//Вывод в сериал порт значений
//Serial.print(realPower);
//Serial.print(' ');
//Serial.print(apparentPower);
//Serial.print(' ');
//Serial.print(powerFactor);
//Serial.print(' ');
//Serial.print(Vrms);
//Serial.print(' ');
//Serial.println(Irms);
//Сброс накопленных значений
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");
lcd.setCursor (10, 3);
lcd.print (temp);
delay(333);
//lcd.print (temp);
//lcd.setCursor (0, 3);
//lcd.print (realPower);
// отправляем значения на срвер majordomo
//значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Vrms);
sendHTTPRequest();
//значение тока
sprintf(buf, "GET /objects/?object=sensorAmper&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Irms);
sendHTTPRequest();
//значение мощности
sprintf(buf, "GET /objects/?object=sensorVatt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)apparentPower);
sendHTTPRequest();
}
С датчиками открытия дверей я разобрался.
В данный момент на ардуино я сделал так называемый "Power Monitor" с помощью датчика тока (трансформатор тока) и датчика напряжения (понижающий трансформатор) я замеряю напряжение и потребляемый ток в квартире, все это, плюс мощность выводится у меня на LCD дисплей.
Теперь, когда увидел этот замечательный проект, решил вывести эти показатели (ток, напряжение, мощность) на сервер majordomo
Вот пой код ардуино. (это замер среднеквадратичных значений переменного напряжения и потребляемого тока).
Добавил в свой код, код приведенный на сайте и вот что у меня получилось. (код этот на железе пока не тестировал!)
точнее код рабочий и выводит все показания на дисплей. а вот передачу данных на сервер еще не пробовал
/*
Код мониторинга электропотребления и трансляции
данных на сервер majordomo
Схема подключения:
* 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, 0xFC }; // MAC-адрес устройства
byte ip[] = { 192, 168, 8, 10 }; // ip-адрес устройства
byte server[] = { 192, 168, 8, 26 }; // IP компьютера на котором установлен сервер majordomo
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.26"); // IP компьютера на котором установлен сервер majordomo
rclient.println();
delay(2000);
rclient.stop();
}
else
{
Serial.println("FAILED");
}
}
int numberOfSamples = 3000;
//Установка датчиков тока и напряжения
int inPinV = 0;
int inPinI = 1;
//*************************************************************************
// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором (амперметром и вольтметром)
double VCAL = 14.30; // для напряжения
double ICAL = 2.51; // для тока
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,
powerFactor,
Vrms,
Irms;
// подключаем библиотеку дисплея:
#include <LiquidCrystal.h>
// инициализация библиотеки с перечнем задействованных выводов
LiquidCrystal lcd (8, 7, 6, 5, 3, 2);
void setup ()
{
Ethernet.begin(mac, ip); // Инициализируем Ethernet Shield
// устанавливаем ШИМ выход (регулируем контрастность дисплея):
pinMode (9, OUTPUT);
analogWrite (9, 70);
// устанавливаем кол-во столбцов и строк:
lcd.begin (16, 4);
lcd.print(" POWER MONITOR");
}
void loop ()
{
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; // значение в киловатах
powerFactor = realPower / apparentPower;
//Вывод в сериал порт значений
//Serial.print(realPower);
//Serial.print(' ');
//Serial.print(apparentPower);
//Serial.print(' ');
//Serial.print(powerFactor);
//Serial.print(' ');
//Serial.print(Vrms);
//Serial.print(' ');
//Serial.println(Irms);
//Сброс накопленных значений
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");
lcd.setCursor (10, 3);
lcd.print (temp);
delay(333);
//lcd.print (temp);
//lcd.setCursor (0, 3);
//lcd.print (realPower);
// отправляем значения на срвер majordomo
//значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Vrms);
sendHTTPRequest();
//значение тока
sprintf(buf, "GET /objects/?object=sensorAmper&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Irms);
sendHTTPRequest();
//значение мощности
sprintf(buf, "GET /objects/?object=sensorVatt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)apparentPower);
sendHTTPRequest();
}
Последний раз редактировалось BATONS Сб июн 30, 2012 5:35 pm, всего редактировалось 2 раза.
-
- Сообщения: 107
- Зарегистрирован: Сб июн 30, 2012 7:54 am
- Благодарил (а): 0
- Поблагодарили: 14 раз
Re: Код прошивки Arduino
вот мои настройки на сервере
Это код метода
//$params['t']
$old_temp=$this->getProperty('electric');
$t=round($params['t']*2)/2;
$this->setProperty('electric',$t);
if ($t>$old_electric) {
$d=1;
} elseif ($t<$old_electric) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
Это код метода
//$params['t']
$old_temp=$this->getProperty('electric');
$t=round($params['t']*2)/2;
$this->setProperty('electric',$t);
if ($t>$old_electric) {
$d=1;
} elseif ($t<$old_electric) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
-
- Сообщения: 107
- Зарегистрирован: Сб июн 30, 2012 7:54 am
- Благодарил (а): 0
- Поблагодарили: 14 раз
Re: Код прошивки Arduino
Если подытожить и не копаться в коде.
то вопрос:
вот это у меня выводится на сериал-порт
Serial.print(apparentPower);
Serial.print(' ');
Serial.print(Vrms);
Serial.print(' ');
Serial.println(Irms);
правильно ли я написал код, для вывода этих значений на сервер?
/значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Vrms);
sendHTTPRequest();
//значение тока
sprintf(buf, "GET /objects/?object=sensorAmper&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Irms);
sendHTTPRequest();
//значение мощности
sprintf(buf, "GET /objects/?object=sensorVatt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)apparentPower);
sendHTTPRequest();
то вопрос:
вот это у меня выводится на сериал-порт
Serial.print(apparentPower);
Serial.print(' ');
Serial.print(Vrms);
Serial.print(' ');
Serial.println(Irms);
правильно ли я написал код, для вывода этих значений на сервер?
/значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Vrms);
sendHTTPRequest();
//значение тока
sprintf(buf, "GET /objects/?object=sensorAmper&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)Irms);
sendHTTPRequest();
//значение мощности
sprintf(buf, "GET /objects/?object=sensorVatt&op=m&m=eleChanged&t=%0d.%d HTTP/1.0", (double)apparentPower);
sendHTTPRequest();
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Код прошивки Arduino
Вот с этого момента поподробнее, пожалуйста. Что за датчик тока и понижающий трансформатор (теория понятна, интересна ваша конкретная реализация). Сколько витков мотать, как подключать, какова точность измерений и. т.п...."Power Monitor" с помощью датчика тока (трансформатор тока) и датчика напряжения (понижающий трансформатор) я замеряю напряжение и потребляемый ток в квартире...
-
- Сообщения: 107
- Зарегистрирован: Сб июн 30, 2012 7:54 am
- Благодарил (а): 0
- Поблагодарили: 14 раз
Re: Код прошивки Arduino
трансформатор тока покупал тут
http://www.seeedstudio.com/depot/noninv ... th=144_154
схема его подключения
резистор 66 ом можно установить в диапазоне 50-100 ом
трансформатор напряжения - брал от блока питания, на выходное напряжение любое в диапазоне 5-18 вольт
схема подключения
http://www.seeedstudio.com/depot/noninv ... th=144_154
схема его подключения
резистор 66 ом можно установить в диапазоне 50-100 ом
трансформатор напряжения - брал от блока питания, на выходное напряжение любое в диапазоне 5-18 вольт
схема подключения
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Код прошивки Arduino
Спасибо. Вопрос значительно прояснился. Но нужны кое-какие пояснения.
10 (кажется) мк — это 10мкф полярный конденсатор?
По датчику тока. Чем можно заменить SCT-013-000, не прибегая к зарубежным интернет-магазинам? Рядом лежат токовые клещи (можно пожертвовать для науки), ещё на ум приходит что-то было у ABB для амперметров на большой ток.
Точность показаний, как я понял, определяется алгоритмом вычисления и юстировкой по прибору? Какова она на практике?
10 (кажется) мк — это 10мкф полярный конденсатор?
По датчику тока. Чем можно заменить SCT-013-000, не прибегая к зарубежным интернет-магазинам? Рядом лежат токовые клещи (можно пожертвовать для науки), ещё на ум приходит что-то было у ABB для амперметров на большой ток.
Точность показаний, как я понял, определяется алгоритмом вычисления и юстировкой по прибору? Какова она на практике?
-
- Сообщения: 107
- Зарегистрирован: Сб июн 30, 2012 7:54 am
- Благодарил (а): 0
- Поблагодарили: 14 раз
Re: Код прошивки Arduino
да, конденсатор я ставил электролит. плюс вверху по схеме.
ардуино не может работать с переменным напряжением, поэтому ей нужно подать положительное смещение, в нашем случае 5 вольт.
а чтобы вывести значения на середину диапазона - собран на резисторах делитель, и в результате мы получаем смещение 2,5 вольта, которые потом в коде и компенсируются.
думаю можно и токовые клещи использовать, подключить их по схеме и далее вместе с контрольным аперметром подобрать опытным путем коэффициенты в програмном коде
//*************************************************************************
// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором (амперметром и вольтметром)
double VCAL = 14.30; // для напряжения
double ICAL = 2.51; // для тока
double PHASECAL = 2.3; // для мощности
//*************************************************************************
double PHASECAL = 2.3; // для мощности - я не трогал. оставил как есть.
Точность измерения у меня была не хуже 1-2 вольта и 0,1 Ампера.
ардуино не может работать с переменным напряжением, поэтому ей нужно подать положительное смещение, в нашем случае 5 вольт.
а чтобы вывести значения на середину диапазона - собран на резисторах делитель, и в результате мы получаем смещение 2,5 вольта, которые потом в коде и компенсируются.
думаю можно и токовые клещи использовать, подключить их по схеме и далее вместе с контрольным аперметром подобрать опытным путем коэффициенты в програмном коде
//*************************************************************************
// Коэффициенты для калибровки выводимых значений
// Подбираются опытным путем сверяясь с эталонным прибором (амперметром и вольтметром)
double VCAL = 14.30; // для напряжения
double ICAL = 2.51; // для тока
double PHASECAL = 2.3; // для мощности
//*************************************************************************
double PHASECAL = 2.3; // для мощности - я не трогал. оставил как есть.
Точность измерения у меня была не хуже 1-2 вольта и 0,1 Ампера.
-
- Сообщения: 107
- Зарегистрирован: Сб июн 30, 2012 7:54 am
- Благодарил (а): 0
- Поблагодарили: 14 раз
Re: Код прошивки Arduino
После установки сниффера, удалось настроить правилный вывод значений напряжения.
строчка у меня получилась такой:
/значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%d HTTP/1.0", (int)Vrms);
sendHTTPRequest();
Сниффер сети показывает вот такую строчку передаваемую на сервер:
GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=219 HTTP/1.0
Проблема теперь в том, что сервер не видит это значение.
видимо что-то не так в коде метода:
//$params['t']
$old_electric=$this->getProperty('electric');
$t=round($params['t']*2)/2;
$this->setProperty('electric',$d);
if ($t>$old_electric) {
$d=1;
} elseif ($t<$old_electric) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
Коллеги, подскажите, какой код нужно написать, чтобы нормально выводилось значение напряжения?
строчка у меня получилась такой:
/значение напряжения
sprintf(buf, "GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=%d HTTP/1.0", (int)Vrms);
sendHTTPRequest();
Сниффер сети показывает вот такую строчку передаваемую на сервер:
GET /objects/?object=sensorVolt&op=m&m=eleChanged&t=219 HTTP/1.0
Проблема теперь в том, что сервер не видит это значение.
видимо что-то не так в коде метода:
//$params['t']
$old_electric=$this->getProperty('electric');
$t=round($params['t']*2)/2;
$this->setProperty('electric',$d);
if ($t>$old_electric) {
$d=1;
} elseif ($t<$old_electric) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
Коллеги, подскажите, какой код нужно написать, чтобы нормально выводилось значение напряжения?