avr/software.ino

74 lines
3.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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