Код: Выделить всё
int sensorValue;
int sensorMax = 0;
uint32_t start_time = millis();
while((millis()-start_time) < Interval)
{
sensorValue = analogRead( Input );
if (sensorValue > sensorMax)
{
sensorMax = sensorValue;
}
}
return sensorMax;
Код: Выделить всё
if ( EN ) {
int sensor_max;
sensor_max = getMaxValue();
amplitude =(float)(sensor_max-512)/1024* value *1000000;
effective = amplitude /1.414;
Код: Выделить всё
/****************************************************************************/
// Function: Measure the amplitude current of the alternating current and
// the effective current of the sinusoidal alternating current.
// Hardware: Grove - Electricity Sensor
// Date: Jan 19,2013
// by www.seeedstudio.com
#define ELECTRICITY_SENSOR A0 // Analog input pin that sensor is attached to
float amplitude_current; //amplitude current
float effective_value; //effective current
void setup()
{
Serial.begin(9600);
pins_init();
}
void loop()
{
int sensor_max;
sensor_max = getMaxValue();
Serial.print("sensor_max = ");
Serial.println(sensor_max);
//the VCC on the Grove interface of the sensor is 5v
amplitude_current=(float)sensor_max/1024*5/800*2000000;
effective_value=amplitude_current/1.414;//minimum_current=1/1024*5/800*2000000/1.414=8.6(mA)
//Only for sinusoidal alternating current
Serial.println("The amplitude of the current is(in mA)");
Serial.println(amplitude_current,1);//Only one number after the decimal point
Serial.println("The effective value of the current is(in mA)");
Serial.println(effective_value,1);
}
void pins_init()
{
pinMode(ELECTRICITY_SENSOR, INPUT);
}
/*Function: Sample for 1000ms and get the maximum value from the SIG pin*/
int getMaxValue()
{
int sensorValue; //value read from the sensor
int sensorMax = 0;
uint32_t start_time = millis();
while((millis()-start_time) < 1000)//sample for 1000ms
{
sensorValue = analogRead(ELECTRICITY_SENSOR);
if (sensorValue > sensorMax)
{
/*record the maximum sensor value*/
sensorMax = sensorValue;
}
}
return sensorMax;
}
Skull писал(а): ↑17.09.2018{, 22:27}Предполагают, что при использовании analogRead () аналоговое опорное напряжение равно 5.0В, но в действительности оно может быть другим.
на разных ПК при питании от USB напряжение пина 5V на Arduino составляет около 4.5В; при питании от аккумулятора типа «Крона» (8.4В) — 4.97В. А измерения в представленном коде пляшут от питания, как опорного напряжения.
Можно использовать встроенный опорный генератор. , предварительно его откалибровав.
Делается это так:
Сначала устанавливаем опорное (reference) напряжение в значение Vcc
Измеряем внутреннее опорное напряжение
Рассчитываем величину Vcc
Наше измеренное напряжение:
Vcc * (АЦП-измерение) / 1023
которое, как мы знаем равно 1.1В. Согласно даташиту на ATMEGA 328 оно может быть равно:
минимально 1.0В,
обычно 1.1В,
максимально 1.2В.
Далее рассчитываем Vcc и получаем:
Vcc = 1.1 * 1023 / АЦП-измерение
Другими словами, вся фишка в том, чтобы выяснить реальное напряжение питания Vcc, читая internal 1.1V reference и используя Vcc в качестве эталона. Затем с помощью простой математики высчитываем реальное Vcc.Это эталонное значение будет индивидуальным для конкретного AVR чипа и будет зависеть от колебаний температуры. А вообще, для таких измерений нужен внешний источник опорного напряжения)
И вот когда это получится, кто-нибудь из местных переведет или объяснит как перевести программу в пользовательский блок.
То, что в программе сейчас- это не измеритель, а показометр. С не сильно отличающейся точностью, от результата, который Вас не удовлетворил.