74 lines
3.3 KiB
C++
74 lines
3.3 KiB
C++
#include <UIPEthernet.h>
|
||
|
||
// 1. СЕТЕВЫЕ НАСТРОЙКИ (Задайте под подсеть вашего дома)
|
||
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
|
||
IPAddress ip(192, 168, 1, 200); // Фиксированный IP вашего шкафа ВРУ
|
||
EthernetServer server(80);
|
||
|
||
// 2. АППАРАТНЫЕ ПИНЫ
|
||
const int PIN_VOLTAGE = A0; // Делитель напряжения шины
|
||
const int PIN_CURRENT = A1; // Датчик Холла ACS758
|
||
|
||
// 3. КАЛИБРОВОЧНЫЕ КОЭФФИЦИЕНТЫ
|
||
// Коэффициент делителя: (110 + 10) / 10 = 12.0
|
||
const float VOLTAGE_DIVIDER_RATIO = 12.0;
|
||
// Чувствительность ACS758-200B составляет 10 мВ на 1 Ампер (0.01 В/А)
|
||
const float SENSITIVITY = 0.01;
|
||
|
||
void setup() {
|
||
// Инициализация сетевого стека ENC28J60
|
||
Ethernet.begin(mac, ip);
|
||
server.begin();
|
||
}
|
||
|
||
void loop() {
|
||
// Ожидание входящего HTTP-запроса от Linux-сервера (curl)
|
||
EthernetClient client = server.available();
|
||
if (client) {
|
||
boolean currentLineIsBlank = true;
|
||
while (client.connected()) {
|
||
if (client.available()) {
|
||
char c = client.read();
|
||
|
||
// Если дошли до конца HTTP-заголовка (пустая строка)
|
||
if (c == '\n' && currentLineIsBlank) {
|
||
|
||
// === ОПРОС ДАТЧИКА НАПРЯЖЕНИЯ ===
|
||
// Делаем оверсемплинг из 20 замеров для сглаживания шумов
|
||
float avgRawV = 0;
|
||
for(int i=0; i<20; i++) { avgRawV += analogRead(PIN_VOLTAGE); delay(1); }
|
||
avgRawV /= 20.0;
|
||
// Расчет: вольты на пине * коэффициент делителя
|
||
float dc_voltage = avgRawV * (5.0 / 1023.0) * VOLTAGE_DIVIDER_RATIO;
|
||
|
||
// === ОПРОС ДАТЧИКА ТОКА ===
|
||
float avgRawI = 0;
|
||
for(int i=0; i<20; i++) { avgRawI += analogRead(PIN_CURRENT); delay(1); }
|
||
avgRawI /= 20.0;
|
||
// Перевод шагов АЦП в вольт-сигнал
|
||
float vOut = avgRawI * (5.0 / 1023.0);
|
||
// Расчет тока: (Текущий вольтаж - средняя точка 2.5В) / чувствительность датчика
|
||
float dc_current = (vOut - 2.5) / SENSITIVITY;
|
||
|
||
// === ОТПРАВКА СЫРОГО ТЕКСТА (UNIX-WAY) ===
|
||
client.println("HTTP/1.1 200 OK");
|
||
client.println("Content-Type: text/plain; charset=utf-8");
|
||
client.println("Connection: close");
|
||
client.println(); // Обязательный пустой разделитель заголовка и тела
|
||
|
||
// Вывод параметров в формате plain-text для простого grep в bash
|
||
client.print("DC_Voltage: "); client.println(dc_voltage, 2);
|
||
client.print("DC_Current: "); client.println(dc_current, 1);
|
||
break;
|
||
}
|
||
|
||
if (c == '\n') { currentLineIsBlank = true; }
|
||
else if (c != '\r') { currentLineIsBlank = false; }
|
||
}
|
||
}
|
||
// Даем время браузеру/скрипту принять данные и жестко рвем сессию
|
||
delay(5);
|
||
client.stop();
|
||
}
|
||
}
|