Актуализировал схемы. Более правильная фильтрация замеряемых значений
This commit is contained in:
BIN
Binary file not shown.
+75
-23
@@ -1,5 +1,63 @@
|
|||||||
#include <ModbusRTU.h>
|
#include <ModbusRTU.h>
|
||||||
|
|
||||||
|
class Reader
|
||||||
|
{
|
||||||
|
const static int AMOUNT = 20;
|
||||||
|
const static int FILTER_SIZE = 5;
|
||||||
|
int pin;
|
||||||
|
int reads[AMOUNT];
|
||||||
|
int current_read;
|
||||||
|
public:
|
||||||
|
|
||||||
|
Reader(int pin)
|
||||||
|
{
|
||||||
|
this->pin = pin;
|
||||||
|
current_read = 0;
|
||||||
|
for (int i = 0; i < AMOUNT; i++) reads[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Read()
|
||||||
|
{
|
||||||
|
reads[current_read] = analogRead(pin);
|
||||||
|
current_read++;
|
||||||
|
if (current_read >= AMOUNT) current_read -= AMOUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sorted_reads[AMOUNT];
|
||||||
|
|
||||||
|
int Get()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < AMOUNT; i++)
|
||||||
|
{
|
||||||
|
sorted_reads[i] = reads[i];
|
||||||
|
}
|
||||||
|
bool f = true;
|
||||||
|
while (f)
|
||||||
|
{
|
||||||
|
f = false;
|
||||||
|
for (int i = 0; i < AMOUNT - 1; i++)
|
||||||
|
{
|
||||||
|
if (sorted_reads[i] > sorted_reads[i + 1])
|
||||||
|
{
|
||||||
|
int t = sorted_reads[i];
|
||||||
|
sorted_reads[i] = sorted_reads[i + 1];
|
||||||
|
sorted_reads[i + 1] = t;
|
||||||
|
f = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}/*
|
||||||
|
float sum = 0;
|
||||||
|
int cnt = 0;
|
||||||
|
for (int i = FILTER_SIZE; i < AMOUNT - FILTER_SIZE; i++)
|
||||||
|
{
|
||||||
|
sum += reads[i];
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
return (int)(sum / cnt + 0.5);*/
|
||||||
|
return sorted_reads[AMOUNT / 2];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
ModbusRTU mb;
|
ModbusRTU mb;
|
||||||
|
|
||||||
#define MODBUS_ADDRESS 1
|
#define MODBUS_ADDRESS 1
|
||||||
@@ -47,6 +105,12 @@ void setup()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reader R2(A2);
|
||||||
|
Reader R3(A3);
|
||||||
|
Reader R4(A4);
|
||||||
|
Reader R5(A5);
|
||||||
|
Reader R7(A7);
|
||||||
|
|
||||||
float I_acc;
|
float I_acc;
|
||||||
float U4;
|
float U4;
|
||||||
float U5;
|
float U5;
|
||||||
@@ -55,8 +119,8 @@ float U3;
|
|||||||
|
|
||||||
void ReadLamp()
|
void ReadLamp()
|
||||||
{
|
{
|
||||||
int a4 = analogRead(A4);
|
int a4 = R4.Get();
|
||||||
int a5 = analogRead(A5);
|
int a5 = R5.Get();
|
||||||
// multiply by 5 as reference current,
|
// multiply by 5 as reference current,
|
||||||
// multiply by 3 because of the divider
|
// multiply by 3 because of the divider
|
||||||
U4 = a4 / 1023.0 * 5 * 3;
|
U4 = a4 / 1023.0 * 5 * 3;
|
||||||
@@ -65,36 +129,19 @@ void ReadLamp()
|
|||||||
|
|
||||||
void ReadAcc()
|
void ReadAcc()
|
||||||
{
|
{
|
||||||
int a2 = analogRead(A2);
|
int a2 = R2.Get();
|
||||||
int a3 = analogRead(A3);
|
int a3 = R3.Get();
|
||||||
// multiply by 5 as reference current,
|
// multiply by 5 as reference current,
|
||||||
// multiply by 3 because of the divider
|
// multiply by 3 because of the divider
|
||||||
U2 = a2 / 1023.0 * 5 * 3;
|
U2 = a2 / 1023.0 * 5 * 3;
|
||||||
U3 = a3 / 1023.0 * 5 * 3;
|
U3 = a3 / 1023.0 * 5 * 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float CURRENT_SENSOR_MAX = 30;
|
const float CURRENT_SENSOR_MAX = 5;
|
||||||
|
|
||||||
void ReadI()
|
void ReadI()
|
||||||
{
|
{
|
||||||
static int reads[10];
|
I_acc = ((R7.Get() + 0.0) / 1023.0 - 0.5) * CURRENT_SENSOR_MAX;
|
||||||
for (int i = 0; i < 10; i++)
|
|
||||||
{
|
|
||||||
reads[i] = analogRead(A7);
|
|
||||||
}
|
|
||||||
int imin = 0, imax = 0;
|
|
||||||
for (int i = 0; i < 10; i++)
|
|
||||||
{
|
|
||||||
if (reads[i] < reads[imin]) imin = i;
|
|
||||||
if (reads[i] < reads[imax]) imax = i;
|
|
||||||
}
|
|
||||||
int total = 0;
|
|
||||||
for (int i = 0; i < 10; i++)
|
|
||||||
{
|
|
||||||
if (i == imin || i == imax) continue;
|
|
||||||
total += reads[i];
|
|
||||||
}
|
|
||||||
I_acc = ((total / 8.0 + 0.0) / 1023.0 - 0.5) * CURRENT_SENSOR_MAX;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteFloatReg(int start, float val)
|
void WriteFloatReg(int start, float val)
|
||||||
@@ -109,6 +156,11 @@ uint16_t lamp_state = 0;
|
|||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
|
R2.Read();
|
||||||
|
R3.Read();
|
||||||
|
R4.Read();
|
||||||
|
R5.Read();
|
||||||
|
R7.Read();
|
||||||
ReadLamp();
|
ReadLamp();
|
||||||
ReadAcc();
|
ReadAcc();
|
||||||
ReadI();
|
ReadI();
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user