#include // 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(); } }