Skip to main content

⚡ РЕЛЕ И СИЛОВАЯ ЭЛЕКТРОНИКА. КИЛОВАТТЫ В ТВОИХ РУКАХ! ВЫСОКОЕ НАПРЯЖЕНИЕ!

📋 Паспорт спринта

Параметр МАКСИМАЛЬНОЕ НАПРЯЖЕНИЕ
Предмет Интернет вещей (элективный курс)
Класс 9 класс
Спринт № 31 из 36 ⚡🔥
Тип занятия СИЛОВАЯ ЭЛЕКТРОНИКА + ВЫСОКОЕ НАПРЯЖЕНИЕ ⚡⚡⚡
Продолжительность 90 минут ЭЛЕКТРИЧЕСКОГО ДОМИНИРОВАНИЯ
Формат POWER SYSTEMS LABORATORY с real voltage

⚠️ КРИТИЧЕСКОЕ ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ! ⚠️

1🚨 DANGER: HIGH VOLTAGE! 🚨
2
3ЭТОТ СПРИНТ РАБОТАЕТ С ОПАСНЫМИ НАПРЯЖЕНИЯМИ!
4• 220V AC может быть СМЕРТЕЛЬНЫМ!
5• Только под СТРОГИМ надзором учителя!
6• ОБЯЗАТЕЛЬНЫЕ защитные средства!
7• Никаких экспериментов БЕЗ разрешения!
8
9SAFETY FIRST - ВСЕГДА И ВЕЗДЕ!

🎯 Цели спринта (СИЛОВЫЕ ЗАДАЧИ!)

ГЛАВНАЯ МИССИЯ:

Овладеть управлением ВЫСОКИМИ мощностями! Создать IoT системы, которые управляют РЕАЛЬНЫМИ электрическими нагрузками промышленного уровня!

КОНКРЕТНЫЕ ДОСТИЖЕНИЯ СИЛЫ:

  • Понимают принципы работы электромеханических реле
  • Программируют Solid State реле для бесшумного управления
  • Создают системы управления освещением и отоплением
  • Реализуют диммеры и регуляторы мощности
  • Проектируют системы безопасности с аварийным отключением
  • 🆕 Строят умные электрощитки с MQTT управлением
  • 🆕 Создают системы бесперебойного питания (UPS)
  • 🆕 Реализуют load balancing для энергоэффективности

🔄 Sprint Retrospective (0-3 мин): ОТ ТОЧНОСТИ К МОЩНОСТИ!

Высоковольтная проверка:

  • “КТО довел ПИД регулирование до математического СОВЕРШЕНСТВА?!”
  • “У кого система реагирует с точностью до МИКРОСЕКУНДЫ?!”
  • “Готовы управлять НЕ милливаттами, а КИЛОВАТТАМИ?!”

СИЛОВАЯ связка: “ПИД дал вам точность управления! Но что толку от точности, если вы управляете только LED светодиодами? Сегодня ваши алгоритмы будут управлять НАСТОЯЩИМИ нагрузками! РЕАЛЬНОЙ МОЩНОСТЬЮ! WELCOME TO THE HIGH VOLTAGE SIDE!” ⚡💥


🕐 Sprint Timeline (90 минут ВЫСОКОВОЛЬТНОГО ГОСПОДСТВА)

⚡ SPRINT START (3-8 мин): ДЕМО СИЛОВОЙ МАГИИ!

🆕 MIND-BLOWING демонстрация МОЩНОСТИ:

  1. Слабый сигнал → МОЩНАЯ нагрузка:

    • Arduino GPIO: 3.3V, 20mA
    • Реле CLICK! → 220V, 10A лампочка ВЗРЫВАЕТСЯ светом!
    • “Из милливатта в КИЛОВАТТЫ!”
  2. Silent Solid State демо:

    • Обычное реле: КЛАЦ-КЛАЦ-КЛАЦ (шумно!)
    • SSR реле: абсолютная ТИШИНА, но лампочка моргает!
    • “Когда нужна тишина И мощность!”
  3. 🆕 Диммер в действии:

    • Плавное затемнение 1000W галогенной лампы
    • От 0% до 100% через MQTT команду
    • “Точное управление ОГРОМНОЙ мощностью!”
  4. Emergency shutdown demo:

    • Кнопка АВАРИЙНОГО ОТКЛЮЧЕНИЯ
    • ВСЕ нагрузки отключаются за 0.1 секунды
    • “Безопасность превыше всего!”

ВЫСОКОВОЛЬТНЫЙ ВЫЗОВ:

  • “КТО может угадать мощность этой лампочки по звуку реле?”
  • “Что произойдет если подключить 10A нагрузку к 5A реле?”
  • “ГДЕ в вашем доме ПРЯМО СЕЙЧАС работают такие системы?”

POWER CHALLENGE: “Микроконтроллеры - это МОЗГИ. Реле - это МУСКУЛЫ. Сегодня ваши мозги получают НАСТОЯЩИЕ мускулы! REAL WORLD POWER!” ⚡💪

📚 THEORY BLOCK (8-25 мин): НАУКА ВЫСОКОГО НАПРЯЖЕНИЯ

Микро-блок 1 (8-13 мин): РЕЛЕ - ЭЛЕКТРОМАГНИТНЫЕ ГИГАНТЫ

 1⚡ ЭЛЕКТРОМЕХАНИЧЕСКОЕ РЕЛЕ = ЭЛЕКТРОМАГНИТНЫЙ ПЕРЕКЛЮЧАТЕЛЬ
 2
 3АНАТОМИЯ РЕЛЕ:
 4┌─────────────────┐
 5│ Coil (катушка)  │ ← Управляющий электромагнит (12V DC)
 6│ Armature        │ ← Подвижный якорь
 7│ Contacts        │ ← Силовые контакты (220V AC, 10A)
 8│ Spring          │ ← Возвратная пружина
 9└─────────────────┘
10
11КАК РАБОТАЕТ МАГИЯ:
121. 12V подается на катушку
132. Электромагнит притягивает якорь
143. Якорь замыкает/размыкает контакты
154. Контакты коммутируют 220V нагрузку
165. Убираем 12V → пружина возвращает якорь
17
18ТИПЫ КОНТАКТОВ:
19🔘 NO (Normally Open):
20   • Покой: контакт РАЗОМКНУТ
21   • Активация: контакт ЗАМЫКАЕТСЯ
22   • Использование: включение нагрузки
23
24🔘 NC (Normally Closed):  
25   • Покой: контакт ЗАМКНУТ
26   • Активация: контакт РАЗМЫКАЕТСЯ
27   • Использование: аварийное отключение
28
29🔘 CHANGEOVER (переключающий):
30   • Один общий + два переключаемых
31   • Common → NO или Common → NC
32   • Использование: переключение между нагрузками
33
34ХАРАКТЕРИСТИКИ РЕЛЕ:
35⚡ COIL VOLTAGE: 5V, 12V, 24V (управление)
36⚡ CONTACT RATING: 250V AC, 10A (нагрузка)
37⚡ SWITCHING TIME: 5-15ms (механическая инерция)
38⚡ LIFETIME: 100,000 - 10,000,000 операций
39⚡ ISOLATION: 4000V между катушкой и контактами
40
41ПРЕИМУЩЕСТВА:
42✅ ВЫСОКАЯ изоляция (гальваническая развязка)
43✅ Любые типы нагрузок (AC, DC, индуктивные)
44✅ ДЕШЕВЫЕ ($1-5)
45✅ Простое управление
46
47НЕДОСТАТКИ:
48❌ ШУМНЫЕ (механический щелчок)
49❌ Медленные (миллисекунды)
50❌ Износ контактов
51❌ Искрение при коммутации
52❌ Electromagnetic interference (EMI)
53
54ПРИМЕНЕНИЯ:
55🏠 Home: освещение, отопление, кондиционеры
56🏭 Industrial: моторы, насосы, конвейеры
57🚗 Automotive: стартер, фары, сигналы
58🔌 Power: автоматические выключатели, контакторы

Интерактив: “Послушайте ЗВУК реле! Каждый щелчок - это коммутация СОТЕН ватт!”

Микро-блок 2 (13-18 мин): SOLID STATE РЕЛЕ - ЭЛЕКТРОННЫЕ НИНДЗЯ

 1🥷 SOLID STATE RELAY (SSR) = ЭЛЕКТРОННЫЙ ПЕРЕКЛЮЧАТЕЛЬ
 2
 3АНАТОМИЯ SSR:
 4┌─────────────────┐
 5│ LED (input)     │ ← Управляющий светодиод (3-32V DC)
 6│ Optocoupler     │ ← Оптическая изоляция  
 7│ TRIAC/MOSFET    │ ← Силовой ключ (220V AC, 25A)
 8│ Zero crossing   │ ← Детектор перехода через ноль
 9└─────────────────┘
10
11ПРИНЦИП РАБОТЫ:
121. Управляющий сигнал → LED светится
132. Фототранзистор принимает свет
143. Драйвер открывает TRIAC/MOSFET
154. Силовая цепь замыкается
165. Zero crossing обеспечивает плавную коммутацию
17
18ТИПЫ SSR:
19🔄 AC SSR (TRIAC based):
20   • Для переменного тока
21   • Управление нагревателями, лампами
22   • Zero crossing switching (мягкая коммутация)
23
24⚡ DC SSR (MOSFET based):
25   • Для постоянного тока  
26   • Управление DC моторами, LED лентами
27   • Быстрая коммутация (микросекунды)
28
29🎛️ PHASE CONTROL SSR:
30   • Управление фазой синусоиды
31   • Плавное регулирование мощности
32   • Диммеры для ламп накаливания
33
34ХАРАКТЕРИСТИКИ SSR:
35⚡ INPUT: 3-32V DC, 5-25mA
36⚡ OUTPUT: 24-480V AC, до 100A
37⚡ SWITCHING TIME: 0.5-10ms
38⚡ ISOLATION: 2500V AC
39⚡ LIFETIME: неограниченный (нет износа)
40⚡ TEMPERATURE: требует радиатора при больших токах
41
42ПРЕИМУЩЕСТВА:
43✅ АБСОЛЮТНАЯ тишина
44✅ Быстрая коммутация
45✅ Долговечность
46✅ Нет искрения
47✅ Высокая частота переключений
48✅ Точное управление мощностью
49
50НЕДОСТАТКИ:
51❌ ДОРОГИЕ ($10-50)
52❌ Нагрев при больших токах
53❌ Только одного типа тока (AC или DC)
54❌ Сложная схемотехника
55❌ Чувствительность к перенапряжениям
56
57🆕 ADVANCED SSR FEATURES:
58
59ZERO CROSSING DETECTION:
60• Включение только в момент перехода AC через ноль
61• Минимизация помех и искрения
62• Защита от бросков тока
63
64SNUBBER CIRCUITS:
65• RC цепочки для подавления переходных процессов
66• Защита от паразитных срабатываний
67• Увеличение срока службы
68
69THERMAL PROTECTION:
70• Встроенная температурная защита
71• Автоматическое отключение при перегреве
72• Индикация состояния

Микро-блок 3 (18-25 мин): СИЛОВЫЕ СИСТЕМЫ И БЕЗОПАСНОСТЬ

 1🏭 ПРОМЫШЛЕННЫЕ СИЛОВЫЕ СИСТЕМЫ
 2
 3КОНТАКТОРЫ - ТЯЖЕЛАЯ АРТИЛЛЕРИЯ:
 4💪 Characteristics:
 5   • 25A - 1000A коммутируемый ток
 6   • 220V - 10kV рабочее напряжение
 7   • Механическая блокировка
 8   • Auxiliary contacts для индикации
 9
10ПРИМЕНЕНИЕ:
11🏭 Трехфазные электродвигатели
12🏭 Промышленные нагреватели  
13🏭 Сварочное оборудование
14🏭 Силовые трансформаторы
15
16АВТОМАТИЧЕСКИЕ ВЫКЛЮЧАТЕЛИ:
17🛡️ Circuit Breakers:
18   • Защита от перегрузки и КЗ
19   • Автоматическое отключение
20   • Manual reset
21   • Дифференциальная защита (УЗО)
22
23ДИММЕРЫ И РЕГУЛЯТОРЫ МОЩНОСТИ:
24🎛️ TRIAC Dimmers:
25   • Phase angle control
26   • 0-100% регулирование мощности
27   • Для резистивных нагрузок (лампы, нагреватели)
28
29🎛️ PWM Power Controllers:
30   • Для индуктивных нагрузок (моторы)
31   • Высокочастотная коммутация
32   • Меньше гармоник в сети
33
34🆕 СИСТЕМЫ БЕЗОПАСНОСТИ:
35
36EMERGENCY STOP SYSTEMS:
37• Категория безопасности SIL 1-3
38• Dual channel redundancy
39• Automatic testing
40• Fail-safe operation
41
42LOCKOUT/TAGOUT (LOTO):
43• Физическая блокировка выключателей
44• Процедуры безопасного обслуживания
45• Personal safety locks
46• Authorized personnel only
47
48ELECTRICAL SAFETY STANDARDS:
49📋 IEC 61511 - Functional Safety
50📋 IEC 60947 - Low Voltage Switchgear  
51📋 NFPA 70E - Electrical Safety in Workplace
52📋 NEC - National Electrical Code
53
54ARC FLASH PROTECTION:
55⚡ Incident Energy Calculations
56⚡ Personal Protective Equipment (PPE)
57⚡ Arc-resistant switchgear
58⚡ Remote operation capabilities
59
60ISOLATION AND EARTHING:
61🔌 Galvanic isolation requirements
62🔌 Protective earthing systems
63🔌 Equipotential bonding
64🔌 Surge protection devices
65
66🆕 SMART POWER DISTRIBUTION:
67
68INTELLIGENT SWITCHGEAR:
69• Ethernet/Modbus communication
70• Real-time power monitoring
71• Predictive maintenance
72• Remote diagnostics
73
74ENERGY MANAGEMENT:
75• Load shedding algorithms
76• Peak demand control
77• Power factor correction
78• Renewable energy integration
79
80CYBERSECURITY FOR POWER SYSTEMS:
81🔒 Network segmentation
82🔒 Industrial firewalls
83🔒 Encrypted communications
84🔒 Security auditing

☕ NO BREAK: АДРЕНАЛИН НЕ ОСТАНАВЛИВАЕТСЯ!

🛠️ ПРАКТИЧЕСКИЙ БЛОК (25-75 мин): HIGH VOLTAGE LABORATORY

Этап 1: Базовое реле управление - Первые киловатты (25-35 мин)

🆕 СИЛОВЫЕ КОНТРОЛЛЕРЫ по группам:

🔵 ГРУППА “SMART LIGHTING CONTROLLERS”:

  1💡 HARDWARE SETUP:
  2 ESP32 (WiFi для удаленного управления)
  3 4-channel relay module (10A, 250V AC)
  4 4x лампочки накаливания (100W каждая)
  5 Current sensors (ACS712-20A)
  6 Emergency stop button (большая красная!)
  7 OLED display для status
  8 Protective enclosure
  9
 10⚠️ КРИТИЧЕСКАЯ БЕЗОПАСНОСТЬ:
 11 НИКОГДА не касаться оголенных проводов!
 12 Подключение только при отключенном питании!
 13 Учитель проверяет ВСЕ соединения!
 14 Protective enclosure ОБЯЗАТЕЛЬНО!
 15
 16ПОДКЛЮЧЕНИЕ ОСВЕЩЕНИЯ:
 17Relay Module  ESP32:
 18├── VCC  5V
 19├── GND  GND  
 20├── IN1  GPIO16 (Light Zone 1)
 21├── IN2  GPIO17 (Light Zone 2)
 22├── IN3  GPIO18 (Light Zone 3)
 23└── IN4  GPIO19 (Light Zone 4)
 24
 25Current Sensors  ESP32:
 26├── Sensor1  GPIO34 (ADC)
 27├── Sensor2  GPIO35 (ADC)
 28├── Sensor3  GPIO32 (ADC)
 29└── Sensor4  GPIO33 (ADC)
 30
 31Emergency Stop  GPIO21 (высший приоритет!)
 32
 33#include <WiFi.h>
 34#include <PubSubClient.h>
 35#include <ArduinoJson.h>
 36
 37// Relay control pins
 38const int RELAY_PINS[4] = {16, 17, 18, 19};
 39const int CURRENT_PINS[4] = {34, 35, 32, 33};
 40const int EMERGENCY_STOP = 21;
 41
 42// Safety state
 43bool emergencyStopActive = false;
 44bool systemSafeToOperate = true;
 45
 46struct LightZone {
 47  bool state;           // ON/OFF
 48  int brightness;       // 0-100% (if dimmer available)
 49  float current;        // Actual current consumption
 50  float power;          // Calculated power
 51  unsigned long onTime; // Time when turned on
 52  bool fault;           // Fault condition detected
 53};
 54
 55LightZone zones[4];
 56
 57void setup() {
 58  Serial.begin(115200);
 59  
 60  // Initialize relay pins as outputs  
 61  for (int i = 0; i < 4; i++) {
 62    pinMode(RELAY_PINS[i], OUTPUT);
 63    digitalWrite(RELAY_PINS[i], HIGH); // Relay OFF (active low)
 64  }
 65  
 66  // Emergency stop as input with pullup
 67  pinMode(EMERGENCY_STOP, INPUT_PULLUP);
 68  attachInterrupt(digitalPinToInterrupt(EMERGENCY_STOP), emergencyStopISR, FALLING);
 69  
 70  // WiFi and MQTT setup
 71  setupWiFi();
 72  setupMQTT();
 73  
 74  // Safety self-test
 75  performSafetyTest();
 76  
 77  Serial.println("Smart Lighting System READY");
 78  Serial.println("SAFETY: Emergency stop armed");
 79}
 80
 81// 🚨 EMERGENCY STOP INTERRUPT (HIGHEST PRIORITY!)
 82void IRAM_ATTR emergencyStopISR() {
 83  emergencyStopActive = true;
 84  
 85  // IMMEDIATELY turn off ALL relays
 86  for (int i = 0; i < 4; i++) {
 87    digitalWrite(RELAY_PINS[i], HIGH); // OFF
 88    zones[i].state = false;
 89  }
 90}
 91
 92void loop() {
 93  // SAFETY CHECK - highest priority
 94  if (emergencyStopActive) {
 95    handleEmergencyStop();
 96    return; // Don't execute anything else!
 97  }
 98  
 99  // Monitor current consumption
100  for (int i = 0; i < 4; i++) {
101    zones[i].current = readCurrent(CURRENT_PINS[i]);
102    zones[i].power = zones[i].current * 220.0; // P = UI (220V nominal)
103    
104    // OVERCURRENT PROTECTION
105    if (zones[i].current > 12.0) { // 12A limit for 10A relay
106      Serial.printf("OVERCURRENT Zone %d: %.2fA - EMERGENCY SHUTDOWN!\n", i+1, zones[i].current);
107      emergencyShutdownZone(i);
108    }
109    
110    // FAULT DETECTION: Current without relay activation
111    if (!zones[i].state && zones[i].current > 0.1) {
112      Serial.printf("FAULT Zone %d: Current detected but relay OFF!\n", i+1);
113      zones[i].fault = true;
114    }
115  }
116  
117  // MQTT command processing
118  if (mqttClient.connected()) {
119    mqttClient.loop();
120  }
121  
122  // Status reporting
123  publishSystemStatus();
124  
125  // Energy monitoring
126  calculateEnergyConsumption();
127  
128  delay(100); // 10 Hz monitoring
129}
130
131void controlLight(int zone, bool state) {
132  // SAFETY CHECKS before any operation
133  if (emergencyStopActive) {
134    Serial.println("BLOCKED: Emergency stop active!");
135    return;
136  }
137  
138  if (zone < 0 || zone > 3) {
139    Serial.println("ERROR: Invalid zone!");
140    return;
141  }
142  
143  if (zones[zone].fault) {
144    Serial.printf("BLOCKED: Zone %d has fault condition!\n", zone+1);
145    return;
146  }
147  
148  // Execute command
149  digitalWrite(RELAY_PINS[zone], state ? LOW : HIGH); // Active low relay
150  zones[zone].state = state;
151  zones[zone].onTime = state ? millis() : 0;
152  
153  Serial.printf("Zone %d: %s\n", zone+1, state ? "ON" : "OFF");
154  
155  // Log to MQTT
156  publishZoneStatus(zone);
157}
158
159// 🆕 Advanced lighting features
160void dimmerControl(int zone, int brightness) {
161  // For future SSR dimmer integration
162  if (brightness < 0) brightness = 0;
163  if (brightness > 100) brightness = 100;
164  
165  zones[zone].brightness = brightness;
166  
167  // Convert brightness to phase angle for TRIAC control
168  int phaseAngle = map(brightness, 0, 100, 140, 10); // degrees
169  
170  // This would control SSR dimmer module
171  // setPhaseAngle(zone, phaseAngle);
172  
173  Serial.printf("Zone %d dimmed to %d%%\n", zone+1, brightness);
174}
175
176void sceneLighting(String scene) {
177  if (scene == "evening") {
178    controlLight(0, true);   // Living room
179    controlLight(1, true);   // Kitchen  
180    controlLight(2, false);  // Bedroom
181    controlLight(3, false);  // Bathroom
182  }
183  else if (scene == "night") {
184    controlLight(0, false);  // All off except...
185    controlLight(1, false);
186    controlLight(2, false);
187    controlLight(3, true);   // Bathroom only
188  }
189  else if (scene == "party") {
190    for (int i = 0; i < 4; i++) {
191      controlLight(i, true); // All zones ON
192    }
193  }
194  else if (scene == "away") {
195    for (int i = 0; i < 4; i++) {
196      controlLight(i, false); // All zones OFF
197    }
198  }
199  
200  Serial.println("Scene activated: " + scene);
201}
202
203// MQTT command handler
204void onMqttMessage(char* topic, byte* payload, unsigned int length) {
205  String message = String((char*)payload, length);
206  StaticJsonDocument<200> doc;
207  deserializeJson(doc, message);
208  
209  if (String(topic) == "lighting/zone/command") {
210    int zone = doc["zone"];
211    bool state = doc["state"];
212    controlLight(zone - 1, state); // Convert to 0-based
213  }
214  
215  else if (String(topic) == "lighting/scene/command") {
216    String scene = doc["scene"];
217    sceneLighting(scene);
218  }
219  
220  else if (String(topic) == "lighting/dimmer/command") {
221    int zone = doc["zone"];
222    int brightness = doc["brightness"];
223    dimmerControl(zone - 1, brightness);
224  }
225  
226  else if (String(topic) == "lighting/emergency/stop") {
227    emergencyStopActive = true;
228    emergencyStopISR(); // Trigger emergency stop
229  }
230}
231
232ПЕРВАЯ БОЕВАЯ ЗАДАЧА:
233 Управление 4 зонами освещения через MQTT
234 Monitoring энергопотребления в real-time  
235 Scene control (evening, night, party, away)
236 Overcurrent protection и fault detection
237 Emergency stop ВСЕГДА работает
238 Energy usage statistics и reporting

🔴 ГРУППА “HEATING CONTROL SYSTEMS”:

  1🔥 HARDWARE SETUP:
  2 Arduino Mega (больше GPIO для complex control)
  3 SSR modules (25A) для heating elements
  4 Temperature sensors (DS18B20) waterproof
  5 Flow sensors для circulation pumps
  6 Pressure sensors для system monitoring
  7 LCD display с кнопками для local control
  8 Watchdog timer module
  9
 10🔥 ПОДКЛЮЧЕНИЕ ОТОПЛЕНИЯ:
 11SSR Heaters  Arduino:
 12├── Heater1 (3kW)  Pin 22 + SSR1
 13├── Heater2 (3kW)  Pin 24 + SSR2  
 14├── Pump1  Pin 26 + SSR3
 15└── Pump2  Pin 28 + SSR4
 16
 17Temperature Sensors:
 18├── Supply  Pin 2 (OneWire bus)
 19├── Return  Pin 2 (OneWire bus)
 20├── Outdoor  Pin 2 (OneWire bus)  
 21└── Tank  Pin 2 (OneWire bus)
 22
 23#include <OneWire.h>
 24#include <DallasTemperature.h>
 25#include <PID_v1.h>
 26
 27// Heating zones
 28struct HeatingZone {
 29  String name;
 30  int ssrPin;
 31  double currentTemp;
 32  double targetTemp;
 33  double output;
 34  PID* controller;
 35  bool enabled;
 36  unsigned long heatingTime; // Total heating time
 37  double energyUsed;         // kWh consumed
 38};
 39
 40// PID controllers для каждой зоны
 41PID heater1PID(&zones[0].currentTemp, &zones[0].output, &zones[0].targetTemp, 2, 5, 1, DIRECT);
 42PID heater2PID(&zones[1].currentTemp, &zones[1].output, &zones[1].targetTemp, 2, 5, 1, DIRECT);
 43
 44HeatingZone zones[2] = {
 45  {"Living Room", 22, 0, 21.0, 0, &heater1PID, true, 0, 0},
 46  {"Bedroom", 24, 0, 19.0, 0, &heater2PID, true, 0, 0}
 47};
 48
 49void setup() {
 50  Serial.begin(115200);
 51  
 52  // Initialize SSR pins
 53  for (int i = 0; i < 2; i++) {
 54    pinMode(zones[i].ssrPin, OUTPUT);
 55    digitalWrite(zones[i].ssrPin, LOW); // SSR OFF
 56    
 57    // Configure PID
 58    zones[i].controller->SetMode(AUTOMATIC);
 59    zones[i].controller->SetOutputLimits(0, 255);
 60    zones[i].controller->SetSampleTime(10000); // 10 second intervals
 61  }
 62  
 63  Serial.println("Heating Control System READY");
 64}
 65
 66void loop() {
 67  // Read all temperatures
 68  readTemperatures();
 69  
 70  // Update each heating zone
 71  for (int i = 0; i < 2; i++) {
 72    updateHeatingZone(i);
 73  }
 74  
 75  // Safety checks
 76  performSafetyChecks();
 77  
 78  // Energy monitoring
 79  calculateEnergyUsage();
 80  
 81  // Status reporting
 82  publishHeatingStatus();
 83  
 84  delay(1000); // 1 Hz main loop
 85}
 86
 87void updateHeatingZone(int zone) {
 88  // Update PID controller
 89  zones[zone].controller->Compute();
 90  
 91  // Convert PID output to PWM для SSR
 92  // SSR with zero-crossing можно использовать PWM для power control
 93  analogWrite(zones[zone].ssrPin, zones[zone].output);
 94  
 95  // Track heating time и energy
 96  if (zones[zone].output > 0) {
 97    zones[zone].heatingTime += 1000; // 1 second
 98    
 99    // Energy calculation: Power * time * duty cycle
100    double dutyCycle = zones[zone].output / 255.0;
101    double powerKW = 3.0; // 3kW heater
102    double energyIncrement = powerKW * dutyCycle * (1.0/3600.0); // kWh
103    zones[zone].energyUsed += energyIncrement;
104  }
105  
106  Serial.printf("Zone %s: %.1f°C → %.1f°C (Output: %.0f%%)\n", 
107                zones[zone].name.c_str(),
108                zones[zone].currentTemp,
109                zones[zone].targetTemp, 
110                (zones[zone].output/255.0)*100);
111}
112
113// 🆕 Advanced heating features
114void weatherCompensation() {
115  double outdoorTemp = getOutdoorTemperature();
116  
117  // Adjust target temperatures based on outdoor conditions
118  for (int i = 0; i < 2; i++) {
119    double baseTarget = (zones[i].name == "Living Room") ? 21.0 : 19.0;
120    
121    if (outdoorTemp < -10) {
122      zones[i].targetTemp = baseTarget + 1.0; // Warmer inside when very cold
123    } else if (outdoorTemp > 15) {
124      zones[i].targetTemp = baseTarget - 1.0; // Cooler inside when mild outside
125    } else {
126      zones[i].targetTemp = baseTarget;
127    }
128  }
129}
130
131void loadBalancing() {
132  // Don't run both 3kW heaters simultaneously to avoid overload
133  static bool alternateHeaters = false;
134  
135  if (zones[0].output > 200 && zones[1].output > 200) {
136    if (alternateHeaters) {
137      zones[0].output = 255; // Full power zone 0
138      zones[1].output = 100; // Reduced power zone 1
139    } else {
140      zones[0].output = 100; // Reduced power zone 0  
141      zones[1].output = 255; // Full power zone 1
142    }
143    
144    alternateHeaters = !alternateHeaters; // Switch every cycle
145    Serial.println("Load balancing: Alternating heater priority");
146  }
147}
148
149ПЕРВАЯ БОЕВАЯ ЗАДАЧА:
150 Dual-zone heating control с PID regulation
151 Weather compensation algorithm
152 Load balancing для power management
153 Energy consumption tracking
154 Safety overtemperature protection
155 MQTT integration для remote control

Этап 2: Solid State и диммирование (35-50 мин)

🟢 ГРУППА “SMART DIMMER SYSTEMS”:

  1🎛️ HARDWARE SETUP:
  2 ESP32 (fast PWM capabilities)
  3 AC dimmer modules (TRIAC-based)
  4 Zero-crossing detection circuits
  5 Phase angle control
  6 Current/voltage monitoring
  7 Touch panel interface
  8 Music sync capability (звук  свет)
  9
 10🎛️ ПОДКЛЮЧЕНИЕ ДИММЕРОВ:
 11AC Dimmer Modules  ESP32:
 12├── Dimmer1  GPIO25 (PWM output)
 13├── Dimmer2  GPIO26 (PWM output)  
 14├── Dimmer3  GPIO27 (PWM output)
 15├── Zero-Cross  GPIO35 (interrupt input)
 16└── Current Sense  GPIO34 (ADC input)
 17
 18#include "driver/ledc.h"
 19
 20// TRIAC dimmer control
 21struct DimmerChannel {
 22  int pin;
 23  int channel;
 24  int brightness;      // 0-100%
 25  int phaseAngle;      // 0-180 degrees
 26  bool enabled;
 27  String name;
 28  float currentLoad;   // Measured current
 29};
 30
 31DimmerChannel dimmers[3] = {
 32  {25, 0, 0, 180, false, "Main Lights", 0},
 33  {26, 1, 0, 180, false, "Accent Lights", 0},
 34  {27, 2, 0, 180, false, "Mood Lights", 0}
 35};
 36
 37volatile bool zeroCrossingDetected = false;
 38volatile unsigned long lastZeroCrossing = 0;
 39
 40void IRAM_ATTR zeroCrossingISR() {
 41  zeroCrossingDetected = true;
 42  lastZeroCrossing = micros();
 43}
 44
 45void setup() {
 46  Serial.begin(115200);
 47  
 48  // Configure zero-crossing interrupt
 49  pinMode(35, INPUT_PULLUP);
 50  attachInterrupt(digitalPinToInterrupt(35), zeroCrossingISR, RISING);
 51  
 52  // Configure PWM channels для phase control
 53  for (int i = 0; i < 3; i++) {
 54    ledcSetup(dimmers[i].channel, 5000, 8); // 5kHz, 8-bit resolution
 55    ledcAttachPin(dimmers[i].pin, dimmers[i].channel);
 56    ledcWrite(dimmers[i].channel, 0); // Start with 0% brightness
 57  }
 58  
 59  Serial.println("Smart Dimmer System READY");
 60}
 61
 62void loop() {
 63  // Phase angle control based on zero-crossing
 64  if (zeroCrossingDetected) {
 65    zeroCrossingDetected = false;
 66    updatePhaseControl();
 67  }
 68  
 69  // Monitor current для каждого dimmer
 70  monitorCurrentConsumption();
 71  
 72  // Process dimming commands
 73  processDimmerCommands();
 74  
 75  // Special effects
 76  handleSpecialEffects();
 77  
 78  delay(10); // 100 Hz control loop
 79}
 80
 81void updatePhaseControl() {
 82  for (int i = 0; i < 3; i++) {
 83    if (dimmers[i].enabled && dimmers[i].brightness > 0) {
 84      
 85      // Convert brightness (0-100%) to phase angle (10-170°)
 86      dimmers[i].phaseAngle = map(dimmers[i].brightness, 0, 100, 170, 10);
 87      
 88      // Calculate delay from zero-crossing
 89      // 50Hz AC = 10ms half-cycle = 180°
 90      unsigned long delayMicros = map(dimmers[i].phaseAngle, 0, 180, 0, 10000);
 91      
 92      // Schedule TRIAC trigger
 93      scheduleTRIACTrigger(i, delayMicros);
 94    } else {
 95      // Turn off completely
 96      ledcWrite(dimmers[i].channel, 0);
 97    }
 98  }
 99}
100
101void scheduleTRIACTrigger(int dimmer, unsigned long delayMicros) {
102  // This would ideally use hardware timer для precise timing
103  // For demo, we use simple delay (не ideal для production!)
104  
105  delayMicroseconds(delayMicros);
106  
107  // Short pulse to trigger TRIAC
108  ledcWrite(dimmers[dimmer].channel, 255); // Trigger pulse
109  delayMicroseconds(100);                  // 100µs pulse width
110  ledcWrite(dimmers[dimmer].channel, 0);   // End pulse
111}
112
113// 🆕 Special effects
114void effectFadeInOut(int dimmer, int duration) {
115  // Smooth fade from 0 to 100% and back
116  for (int brightness = 0; brightness <= 100; brightness += 2) {
117    dimmers[dimmer].brightness = brightness;
118    delay(duration / 100);
119  }
120  
121  for (int brightness = 100; brightness >= 0; brightness -= 2) {
122    dimmers[dimmer].brightness = brightness;
123    delay(duration / 100);
124  }
125}
126
127void effectColorTemperature(int warmDimmer, int coolDimmer, int temperature) {
128  // Temperature: 2700K (warm) to 6500K (cool)
129  int warmBrightness = map(temperature, 2700, 6500, 100, 0);
130  int coolBrightness = map(temperature, 2700, 6500, 0, 100);
131  
132  dimmers[warmDimmer].brightness = warmBrightness;
133  dimmers[coolDimmer].brightness = coolBrightness;
134  
135  Serial.printf("Color temp: %dK (Warm: %d%%, Cool: %d%%)\n", 
136                temperature, warmBrightness, coolBrightness);
137}
138
139void effectMusicSync() {
140  // Read audio input (microphone or line-in)
141  int audioLevel = analogRead(A0);
142  
143  // Convert audio level to brightness
144  int brightness = map(audioLevel, 0, 4095, 0, 100);
145  
146  // Apply to all dimmers with different sensitivities
147  dimmers[0].brightness = brightness;           // Direct response
148  dimmers[1].brightness = brightness * 0.7;    // 70% response
149  dimmers[2].brightness = brightness * 0.4;    // 40% response
150  
151  // Bass emphasis (low-pass filter)
152  static int bassLevel = 0;
153  bassLevel = (bassLevel * 0.8) + (brightness * 0.2);
154  dimmers[2].brightness = bassLevel; // Bass-driven mood lighting
155}
156
157// MQTT command handler
158void onMqttMessage(char* topic, byte* payload, unsigned int length) {
159  String message = String((char*)payload, length);
160  StaticJsonDocument<200> doc;
161  deserializeJson(doc, message);
162  
163  if (String(topic) == "dimmer/channel/set") {
164    int channel = doc["channel"];
165    int brightness = doc["brightness"];
166    
167    if (channel >= 0 && channel < 3) {
168      dimmers[channel].brightness = constrain(brightness, 0, 100);
169      dimmers[channel].enabled = (brightness > 0);
170    }
171  }
172  
173  else if (String(topic) == "dimmer/effect/start") {
174    String effect = doc["effect"];
175    
176    if (effect == "fade") {
177      int channel = doc["channel"];
178      int duration = doc["duration"];
179      effectFadeInOut(channel, duration);
180    }
181    else if (effect == "music_sync") {
182      // Enable music sync mode
183      enableMusicSync();
184    }
185    else if (effect == "color_temp") {
186      int temperature = doc["temperature"];
187      effectColorTemperature(0, 1, temperature);
188    }
189  }
190}
191
192ПЕРВАЯ БОЕВАЯ ЗАДАЧА:
193 3-channel AC dimming с phase control
194 Zero-crossing detection для smooth operation
195 Special effects: fade, color temperature, music sync
196 Current monitoring и overload protection
197 MQTT control interface
198 Touch panel local control

Этап 3: Промышленная автоматизация (50-65 мин)

🟡 ГРУППА “INDUSTRIAL AUTOMATION CELL”:

  1🏭 HARDWARE SETUP:
  2 PLC-style controller (Arduino Industrial)
  3 Multiple contactor modules (25A, 3-phase)
  4 Industrial sensors (proximity, photoelectric)
  5 Motor starters с overload protection
  6 HMI touch panel
  7 Emergency stop circuits (Category 3 safety)
  8 24V DC industrial power supply
  9
 10🏭 ПОДКЛЮЧЕНИЕ ПРОМЫШЛЕННОЙ СИСТЕМЫ:
 11Contactors  Industrial Controller:
 12├── Motor1 Contactor  Output 1
 13├── Motor2 Contactor  Output 2
 14├── Conveyor Contactor  Output 3
 15├── Heater Contactor  Output 4
 16├── Cooling Fan  Output 5
 17└── Emergency Systems  Hardwired safety
 18
 19Sensors  Controller:
 20├── Part Present  Input 1
 21├── Position Sensor  Input 2  
 22├── Safety Door  Input 3
 23├── Pressure Switch  Input 4
 24└── Temperature  Analog Input 1
 25
 26#include <ModbusRTU.h>
 27#include <HMI_Display.h>
 28
 29// Industrial I/O mapping
 30struct IndustrialIO {
 31  // Digital outputs (contactors/relays)
 32  bool motor1Running;
 33  bool motor2Running; 
 34  bool conveyorRunning;
 35  bool heaterEnabled;
 36  bool coolingFanRunning;
 37  
 38  // Digital inputs (sensors)
 39  bool partPresent;
 40  bool positionSensor;
 41  bool safetyDoorClosed;
 42  bool pressureOK;
 43  
 44  // Analog inputs
 45  float temperature;
 46  float pressure;
 47  float vibration;
 48  
 49  // System status
 50  bool systemReady;
 51  bool emergencyStop;
 52  bool faultCondition;
 53};
 54
 55IndustrialIO io;
 56
 57// Production sequence states
 58enum ProductionState {
 59  IDLE,
 60  PART_LOADING,
 61  PROCESSING,
 62  QUALITY_CHECK,
 63  PART_UNLOADING,
 64  FAULT
 65};
 66
 67ProductionState currentState = IDLE;
 68unsigned long stateStartTime = 0;
 69
 70void setup() {
 71  Serial.begin(115200);
 72  
 73  // Initialize industrial I/O
 74  initializeIndustrialIO();
 75  
 76  // Setup Modbus communication
 77  setupModbus();
 78  
 79  // Initialize HMI
 80  setupHMI();
 81  
 82  // Safety system self-test
 83  performSafetyTest();
 84  
 85  Serial.println("Industrial Automation Cell READY");
 86}
 87
 88void loop() {
 89  // HIGHEST PRIORITY: Safety monitoring
 90  monitorSafetySystems();
 91  
 92  if (io.emergencyStop || io.faultCondition) {
 93    handleEmergencyState();
 94    return;
 95  }
 96  
 97  // Read all sensors
 98  updateInputs();
 99  
100  // Main production sequence
101  runProductionSequence();
102  
103  // Update outputs
104  updateOutputs();
105  
106  // Process Modbus communications
107  processModbus();
108  
109  // Update HMI display
110  updateHMI();
111  
112  // Data logging
113  logProductionData();
114  
115  delay(50); // 20 Hz industrial control loop
116}
117
118void runProductionSequence() {
119  switch (currentState) {
120    
121    case IDLE:
122      // Wait for part и safety conditions
123      if (io.partPresent && io.safetyDoorClosed && io.pressureOK) {
124        Serial.println("Production: Starting cycle");
125        changeState(PART_LOADING);
126      }
127      break;
128      
129    case PART_LOADING:
130      // Start conveyor to position part
131      io.conveyorRunning = true;
132      
133      if (io.positionSensor) {
134        Serial.println("Production: Part positioned");
135        io.conveyorRunning = false;
136        changeState(PROCESSING);
137      }
138      
139      // Timeout protection
140      if (getStateTime() > 10000) { // 10 seconds max
141        Serial.println("ERROR: Part loading timeout");
142        changeState(FAULT);
143      }
144      break;
145      
146    case PROCESSING:
147      // Start motors и heater для processing
148      io.motor1Running = true;
149      io.motor2Running = true;
150      io.heaterEnabled = true;
151      
152      // Wait for temperature и processing time
153      if (io.temperature > 80.0 && getStateTime() > 15000) {
154        Serial.println("Production: Processing complete");
155        changeState(QUALITY_CHECK);
156      }
157      
158      // Fault detection
159      if (io.temperature > 120.0) {
160        Serial.println("ERROR: Overtemperature");
161        changeState(FAULT);
162      }
163      break;
164      
165    case QUALITY_CHECK:
166      // Stop heating, start cooling
167      io.heaterEnabled = false;
168      io.coolingFanRunning = true;
169      
170      // Check quality parameters
171      if (checkQualityParameters()) {
172        Serial.println("Production: Quality OK");
173        changeState(PART_UNLOADING);
174      } else {
175        Serial.println("ERROR: Quality failure");
176        changeState(FAULT);
177      }
178      break;
179      
180    case PART_UNLOADING:
181      // Move part out
182      io.conveyorRunning = true;
183      
184      if (!io.partPresent) {
185        Serial.println("Production: Cycle complete");
186        allOutputsOff();
187        changeState(IDLE);
188      }
189      break;
190      
191    case FAULT:
192      // All outputs OFF, wait for reset
193      allOutputsOff();
194      
195      if (getFaultResetCommand()) {
196        Serial.println("Production: Fault reset");
197        changeState(IDLE);
198      }
199      break;
200  }
201}
202
203// 🆕 Predictive maintenance
204void predictiveMaintenance() {
205  // Vibration analysis
206  if (io.vibration > VIBRATION_WARNING_LEVEL) {
207    sendMaintenanceAlert("High vibration detected on Motor1");
208  }
209  
210  // Temperature trending
211  static float tempHistory[100];
212  static int tempIndex = 0;
213  
214  tempHistory[tempIndex] = io.temperature;
215  tempIndex = (tempIndex + 1) % 100;
216  
217  // Calculate temperature trend
218  float tempTrend = calculateTrend(tempHistory, 100);
219  if (tempTrend > 0.5) { // Rising trend
220    sendMaintenanceAlert("Temperature trending upward - check cooling system");
221  }
222  
223  // Runtime hours tracking
224  static unsigned long motorRuntime = 0;
225  if (io.motor1Running) {
226    motorRuntime += 50; // 50ms loop time
227  }
228  
229  if (motorRuntime > MOTOR_MAINTENANCE_INTERVAL) {
230    sendMaintenanceAlert("Motor1 due for maintenance - " + String(motorRuntime/3600000) + " hours");
231  }
232}
233
234// 🆕 Energy optimization
235void energyOptimization() {
236  // Load shedding during peak demand
237  if (getPeakDemandSignal()) {
238    if (!isCriticalProduction()) {
239      // Temporarily reduce non-essential loads
240      io.coolingFanRunning = false;
241      io.heaterEnabled = false;
242      
243      scheduleRestart(5 * 60 * 1000); // Resume in 5 minutes
244    }
245  }
246  
247  // Power factor optimization
248  if (getPowerFactor() < 0.85) {
249    activateCapacitorBank();
250  }
251  
252  // Variable speed drive optimization
253  adjustMotorSpeed(calculateOptimalSpeed());
254}
255
256ПЕРВАЯ БОЕВАЯ ЗАДАЧА:
257 Complete production sequence automation
258 Multi-state machine operation
259 Industrial safety systems
260 Predictive maintenance algorithms
261 Energy optimization features
262 Modbus communication
263 HMI operator interface

Этап 4: Система координации - Smart Grid (65-70 мин)

🆕 “SMART POWER GRID” - все силовые системы в единой сети:

  1// 🌐 SMART GRID COORDINATION SYSTEM
  2#include <WiFi.h>
  3#include <PubSubClient.h>
  4#include <ArduinoJson.h>
  5#include <ModbusIP.h>
  6
  7// Global grid state
  8struct GridNode {
  9  String nodeId;
 10  String nodeType;        // "lighting", "heating", "industrial"
 11  float powerConsumption; // Current power draw (kW)
 12  float maxCapacity;      // Maximum rated power (kW)
 13  int priority;           // 1=critical, 5=optional
 14  bool canShed;           // Can this load be temporarily disconnected?
 15  bool isOnline;
 16  unsigned long lastUpdate;
 17};
 18
 19std::vector<GridNode> gridNodes;
 20float totalGridLoad = 0;
 21float gridCapacity = 50.0; // 50kW total grid capacity
 22bool peakDemandMode = false;
 23
 24// 🔋 ENERGY STORAGE SYSTEM
 25struct BatterySystem {
 26  float capacity;         // Total capacity (kWh)
 27  float currentCharge;    // Current stored energy (kWh)
 28  float chargeRate;       // Current charging rate (kW)
 29  float dischargeRate;    // Current discharge rate (kW)
 30  bool charging;
 31  bool discharging;
 32  float efficiency;       // Round-trip efficiency (0.85 = 85%)
 33};
 34
 35BatterySystem battery = {100.0, 50.0, 0, 0, false, false, 0.85};
 36
 37void setup() {
 38  Serial.begin(115200);
 39  
 40  // Initialize grid communication
 41  setupGridCommunication();
 42  
 43  // Register this node
 44  registerGridNode();
 45  
 46  // Start grid monitoring
 47  startGridMonitoring();
 48  
 49  Serial.println("Smart Grid Controller READY");
 50}
 51
 52void loop() {
 53  // Update grid status
 54  updateGridStatus();
 55  
 56  // Load balancing decisions
 57  performLoadBalancing();
 58  
 59  // Energy storage management
 60  manageBatterySystem();
 61  
 62  // Renewable energy integration
 63  manageRenewableEnergy();
 64  
 65  // Grid optimization
 66  optimizeGridOperation();
 67  
 68  // Emergency response
 69  handleGridEmergencies();
 70  
 71  delay(1000); // 1 Hz grid management
 72}
 73
 74// 🎯 INTELLIGENT LOAD BALANCING
 75void performLoadBalancing() {
 76  // Calculate total current load
 77  totalGridLoad = 0;
 78  for (auto& node : gridNodes) {
 79    if (node.isOnline) {
 80      totalGridLoad += node.powerConsumption;
 81    }
 82  }
 83  
 84  // Check if approaching capacity limit
 85  float loadPercentage = (totalGridLoad / gridCapacity) * 100;
 86  
 87  if (loadPercentage > 95) {
 88    Serial.println("CRITICAL: Grid approaching capacity limit!");
 89    initiateLoadShedding();
 90  }
 91  else if (loadPercentage > 85) {
 92    Serial.println("WARNING: High grid load - optimizing");
 93    optimizeNonCriticalLoads();
 94  }
 95  else if (loadPercentage < 30 && battery.currentCharge < battery.capacity * 0.8) {
 96    // Low load - good time to charge batteries
 97    startBatteryCharging();
 98  }
 99  
100  Serial.printf("Grid Load: %.1fkW / %.1fkW (%.1f%%)\n", 
101                totalGridLoad, gridCapacity, loadPercentage);
102}
103
104void initiateLoadShedding() {
105  Serial.println("Initiating emergency load shedding...");
106  
107  // Sort nodes by priority (shed lowest priority first)
108  std::sort(gridNodes.begin(), gridNodes.end(), 
109           [](const GridNode& a, const GridNode& b) {
110             return a.priority > b.priority;
111           });
112  
113  float targetReduction = totalGridLoad - (gridCapacity * 0.90); // Target 90% load
114  float actualReduction = 0;
115  
116  for (auto& node : gridNodes) {
117    if (node.canShed && actualReduction < targetReduction) {
118      // Send load shed command
119      shedLoad(node.nodeId, node.powerConsumption);
120      actualReduction += node.powerConsumption;
121      
122      Serial.printf("SHED: %s (%.1fkW) - Priority %d\n", 
123                    node.nodeId.c_str(), node.powerConsumption, node.priority);
124    }
125  }
126  
127  // Log load shedding event
128  logGridEvent("LOAD_SHED", actualReduction, "Emergency capacity protection");
129}
130
131// 🌞 RENEWABLE ENERGY INTEGRATION
132void manageRenewableEnergy() {
133  static float solarGeneration = 0;
134  static float windGeneration = 0;
135  
136  // Simulate renewable energy sources (в real system - actual sensors)
137  solarGeneration = calculateSolarGeneration();
138  windGeneration = calculateWindGeneration();
139  
140  float totalRenewable = solarGeneration + windGeneration;
141  
142  Serial.printf("Renewable: Solar %.1fkW, Wind %.1fkW, Total %.1fkW\n",
143                solarGeneration, windGeneration, totalRenewable);
144  
145  // Grid feed-in decision
146  if (totalRenewable > totalGridLoad) {
147    // Excess renewable energy
148    float excess = totalRenewable - totalGridLoad;
149    
150    if (battery.currentCharge < battery.capacity * 0.95) {
151      // Charge batteries with excess
152      battery.chargeRate = min(excess, 10.0); // Max 10kW charge rate
153      battery.charging = true;
154      battery.discharging = false;
155      
156      Serial.printf("Charging battery with %.1fkW excess renewable\n", battery.chargeRate);
157    } else {
158      // Sell excess to grid или curtail production
159      sellExcessToGrid(excess);
160    }
161  }
162  else if (totalRenewable < totalGridLoad * 0.8) {
163    // Low renewable generation - may need grid power или battery
164    float shortfall = totalGridLoad - totalRenewable;
165    
166    if (battery.currentCharge > battery.capacity * 0.2) {
167      // Use battery to supplement
168      battery.dischargeRate = min(shortfall, battery.currentCharge * 0.1); // Max 10% per hour
169      battery.charging = false;
170      battery.discharging = true;
171      
172      Serial.printf("Supplementing with %.1fkW from battery\n", battery.dischargeRate);
173    } else {
174      // Need grid power
175      purchaseGridPower(shortfall);
176    }
177  }
178}
179
180// 🔋 BATTERY MANAGEMENT SYSTEM
181void manageBatterySystem() {
182  static unsigned long lastBatteryUpdate = 0;
183  
184  if (millis() - lastBatteryUpdate >= 1000) { // Update every second
185    
186    if (battery.charging && battery.chargeRate > 0) {
187      // Add energy to battery (accounting for efficiency)
188      float energyAdded = (battery.chargeRate * battery.efficiency) / 3600.0; // kWh per second
189      battery.currentCharge += energyAdded;
190      
191      if (battery.currentCharge >= battery.capacity) {
192        battery.currentCharge = battery.capacity;
193        battery.charging = false;
194        battery.chargeRate = 0;
195        Serial.println("Battery fully charged");
196      }
197    }
198    
199    if (battery.discharging && battery.dischargeRate > 0) {
200      // Remove energy from battery
201      float energyUsed = battery.dischargeRate / 3600.0; // kWh per second
202      battery.currentCharge -= energyUsed;
203      
204      if (battery.currentCharge <= 0) {
205        battery.currentCharge = 0;
206        battery.discharging = false;
207        battery.dischargeRate = 0;
208        Serial.println("Battery depleted");
209      }
210    }
211    
212    lastBatteryUpdate = millis();
213  }
214  
215  // Battery health monitoring
216  float stateOfCharge = (battery.currentCharge / battery.capacity) * 100;
217  
218  if (stateOfCharge < 10) {
219    Serial.println("WARNING: Battery critically low");
220    // Initiate controlled load shedding to preserve critical systems
221  }
222  else if (stateOfCharge > 95) {
223    Serial.println("INFO: Battery near full capacity");
224    // Good time для high-energy activities
225  }
226  
227  // Publish battery status
228  publishBatteryStatus(stateOfCharge, battery.charging, battery.discharging);
229}
230
231// 🚨 GRID EMERGENCY RESPONSE
232void handleGridEmergencies() {
233  // Monitor для grid anomalies
234  
235  // Frequency monitoring (50Hz nominal)
236  float gridFrequency = measureGridFrequency();
237  if (gridFrequency < 49.5 || gridFrequency > 50.5) {
238    Serial.printf("ALERT: Grid frequency anomaly: %.2fHz\n", gridFrequency);
239    
240    if (gridFrequency < 49.0) {
241      // Under-frequency load shedding
242      initiateUFLS();
243    }
244  }
245  
246  // Voltage monitoring
247  float gridVoltage = measureGridVoltage();
248  if (gridVoltage < 207 || gridVoltage > 253) { // ±10% of 230V
249    Serial.printf("ALERT: Grid voltage anomaly: %.1fV\n", gridVoltage);
250    
251    if (gridVoltage < 190) {
252      // Critical under-voltage - disconnect sensitive loads
253      protectSensitiveLoads();
254    }
255  }
256  
257  // Communication loss detection
258  unsigned long now = millis();
259  for (auto& node : gridNodes) {
260    if (now - node.lastUpdate > 30000) { // 30 seconds timeout
261      Serial.printf("WARNING: Lost communication with %s\n", node.nodeId.c_str());
262      node.isOnline = false;
263      
264      // Assume worst-case load для safety
265      node.powerConsumption = node.maxCapacity;
266    }
267  }
268}
269
270// 📊 GRID ANALYTICS AND OPTIMIZATION
271void optimizeGridOperation() {
272  // Peak demand prediction
273  float predictedPeak = predictPeakDemand();
274  
275  if (predictedPeak > gridCapacity * 0.9) {
276    // Prepare для peak demand
277    Serial.println("Preparing for predicted peak demand");
278    
279    // Pre-charge batteries
280    if (battery.currentCharge < battery.capacity * 0.8) {
281      startBatteryCharging();
282    }
283    
284    // Pre-heat/cool buildings to reduce peak load
285    sendPreConditioningCommands();
286    
287    // Schedule non-critical loads для off-peak times
288    scheduleFlexibleLoads();
289  }
290  
291  // Power quality optimization
292  optimizePowerQuality();
293  
294  // Economic dispatch
295  economicDispatch();
296}
297
298// MQTT Grid Communication
299void onGridMqttMessage(char* topic, byte* payload, unsigned int length) {
300  String message = String((char*)payload, length);
301  StaticJsonDocument<300> doc;
302  deserializeJson(doc, message);
303  
304  if (String(topic) == "grid/node/status") {
305    updateNodeStatus(doc["nodeId"], doc["power"], doc["status"]);
306  }
307  
308  else if (String(topic) == "grid/emergency/command") {
309    String command = doc["command"];
310    
311    if (command == "load_shed") {
312      float targetReduction = doc["amount"];
313      initiateLoadShedding();
314    }
315    else if (command == "islanding") {
316      initiateIslandMode();
317    }
318  }
319  
320  else if (String(topic) == "grid/pricing/update") {
321    float currentPrice = doc["price"];
322    updateEnergyPricing(currentPrice);
323  }
324}

🎯 POWER GRID OLYMPICS (70-83 мин): ЭНЕРГЕТИЧЕСКОЕ ГОСПОДСТВО!

🆕 Формат: “Smart Grid Challenge - Energy Domination Championship!”

🏆 ЭНЕРГЕТИЧЕСКИЕ ДИСЦИПЛИНЫ:

⚡ LOAD BALANCING MASTERS:

1ЗАДАЧА: Perfect grid balancing под переменной нагрузкой
2 Simulate random load changes every 30 seconds
3 Maintain grid stability within ±5% of capacity
4 Minimize load shedding events
5 Scoring: Stability × Efficiency × Response time
6 BONUS: Zero load shedding events (+100 points)

🔋 ENERGY STORAGE WIZARDS:

1ЗАДАЧА: Optimal battery management strategy
2 24-hour simulation with variable renewable generation
3 Maximize renewable energy utilization
4 Minimize grid power purchases
5 Maintain battery health (avoid deep cycles)
6 BONUS: 100% renewable energy day (+200 points)

🌞 RENEWABLE INTEGRATION CHAMPIONS:

1ЗАДАЧА: Maximum renewable penetration
2✓ Integrate solar + wind + battery systems
3✓ Handle rapid weather changes
4✓ Maintain grid frequency ±0.1Hz
5✓ Economic optimization (lowest cost per kWh)
6✓ LEGENDARY: Grid-independent operation (+500 points)

🚨 EMERGENCY RESPONSE HEROES:

1ЗАДАЧА: Grid emergency management
2 Handle simulated blackout scenarios
3 Prioritize critical loads (hospital, safety systems)
4 Restore power in optimal sequence
5 Coordinate with emergency services
6 MASTER LEVEL: Zero critical system outages (+1000 points)

🏭 INDUSTRIAL COORDINATION FINALE:

1ЗАДАЧА: Complete factory automation
2✓ Coordinate lighting + heating + industrial systems
3✓ Real-time energy optimization
4✓ Predictive maintenance integration
5✓ Safety system integration
6✓ ULTIMATE: Industry 4.0 digital twin (+2000 points)

🔍 POWER ANALYSIS (83-87 мин): Энергетическая оценка

ВОЗВРАЩАЕМСЯ К СПРИНТУ 31! 🔥⚡ ЗАВЕРШАЕМ POWER ANALYSIS! ЭНЕРГЕТИЧЕСКОЕ ДОМИНИРОВАНИЕ!

🔍 POWER ANALYSIS (83-87 мин): Энергетическая оценка

🆕 Professional grid evaluation:

 1📊 POWER SYSTEM METRICS:
 2
 3GRID STABILITY:
 4• Frequency deviation: ±0.2Hz от 50Hz nominal (жесткий стандарт!)
 5• Voltage regulation: ±5% от 230V номинала
 6• Phase balance: <3% разность между фазами
 7• Power factor: >0.95 (реактивная мощность под контролем)
 8• THD (Total Harmonic Distortion): <5% для качества сети
 9
10LOAD MANAGEMENT:
11• Peak demand shaving effectiveness: % снижения пикового потребления
12• Load factor: средняя нагрузка / пиковая нагрузка
13• Diversity factor: как разные нагрузки дополняют друг друга
14• Demand response time: скорость реакции на команды отключения
15• Load shedding accuracy: ±2% от заданного сброса нагрузки
16
17RELIABILITY METRICS:
18• SAIFI (System Average Interruption Frequency Index): количество отключений/год
19• SAIDI (System Average Interruption Duration Index): общее время отключений
20• CAIDI (Customer Average Interruption Duration Index): среднее время восстановления
21• MTBF (Mean Time Between Failures): время между отказами оборудования
22• MTTR (Mean Time To Repair): время восстановления после отказа
23
24ENERGY EFFICIENCY:
25• Transmission losses: <3% потери в сети
26• Distribution losses: <5% потери на распределении
27• Reactive power compensation: коэффициент мощности optimization
28• Energy storage efficiency: round-trip efficiency батарей (85-95%)
29• Renewable energy utilization: % использования зеленой энергии
30
31ECONOMIC PERFORMANCE:
32• $/kWh cost optimization: стоимость производства энергии
33• Peak demand charges: сокращение платежей за пиковую мощность
34• Energy arbitrage profits: заработок на разнице цен
35• Maintenance cost reduction: экономия через predictive maintenance
36• ROI (Return on Investment): окупаемость smart grid инвестиций
37
38SAFETY & COMPLIANCE:
39• Arc flash incident energy: <1.2 cal/cm² для безопасности персонала
40• Ground fault protection: время срабатывания <0.1 секунды
41• Overcurrent protection coordination: селективность защит
42• Insulation resistance: >1 МОм для безопасности
43• EMI/EMC compliance: соответствие стандартам электромагнитной совместимости
44
45ENVIRONMENTAL IMPACT:
46• CO2 emissions reduction: kg CO2/kWh сокращение
47• Renewable energy integration: % зеленой энергии в сети
48• Energy storage utilization: эффективность накопления
49• Grid modernization benefits: улучшения от smart grid
50• Sustainability score: общий экологический индекс
51
52CYBERSECURITY METRICS:
53• Security incident response time: время реакции на атаки
54• Vulnerability assessment score: оценка защищенности
55• Penetration testing results: результаты тестов безопасности
56• Compliance with IEC 62443: соответствие стандартам кибербезопасности
57• Network segmentation effectiveness: изоляция критических систем
58
59DIGITAL TRANSFORMATION:
60• IoT device connectivity: количество подключенных smart устройств
61• Data analytics utilization: использование больших данных
62• AI/ML algorithm performance: эффективность искусственного интеллекта
63• Digital twin accuracy: точность виртуальных моделей
64• Edge computing deployment: распределение вычислений
65
66CUSTOMER SATISFACTION:
67• Power quality complaints: количество жалоб на качество
68• Service restoration time: время восстановления подачи
69• Bill accuracy: точность расчетов за электроэнергию
70• Smart meter deployment: % умных счетчиков
71• Customer engagement score: вовлеченность потребителей
72
73INNOVATION METRICS:
74• New technology adoption rate: скорость внедрения инноваций
75• R&D investment effectiveness: эффективность исследований
76• Patent applications filed: количество патентных заявок
77• Industry 4.0 integration level: уровень цифровизации
78• Future-readiness score: готовность к будущим вызовам
79
80BENCHMARKING STANDARDS:
81• Tier 1 Grid: 99.99% availability, <0.1Hz frequency deviation
82• Tier 2 Grid: 99.9% availability, <0.2Hz frequency deviation  
83• Tier 3 Grid: 99% availability, <0.5Hz frequency deviation
84• World-class utilities: top 10% performance globally
85• Industry average: median performance по всем метрикам
86
87REAL-TIME MONITORING:
88• SCADA system response: <100ms для критических команд
89• PMU (Phasor Measurement Unit) accuracy: ±0.1% измерения
90• Smart meter data frequency: каждые 15 минут minimum
91• Weather station integration: real-time метеоданные
92• Communication network latency: <50ms для управляющих сигналов

⚡ КРИТЕРИИ ОЦЕНКИ КОМАНД:

 1🏆 POWER GRID MASTERY LEVELS:
 2
 3ЭЛЕКТРОЭНЕРГЕТИЧЕСКИЙ ГЕНИЙ (5 баллов):
 4✅ Frequency stability ±0.1Hz под любой нагрузкой
 5✅ Zero unplanned outages during simulation
 6✅ >95% renewable energy integration
 7✅ Predictive maintenance preventing all failures
 8✅ Real-time optimization reducing costs на 30%+
 9✅ Cybersecurity: zero successful attacks
10✅ Customer satisfaction: zero complaints
11
12ЭНЕРГЕТИЧЕСКИЙ ПРОФЕССИОНАЛ (4 балла):
13✅ Frequency stability ±0.2Hz
14✅ <1 unplanned outage per simulation
15✅ >80% renewable integration
16✅ Predictive maintenance catching 90% issues
17✅ Cost reduction 15-30%
18✅ Strong cybersecurity posture
19✅ High customer satisfaction
20
21КОМПЕТЕНТНЫЙ ЭЛЕКТРИК (3 балла):
22✅ Frequency stability ±0.5Hz
23✅ 2-3 outages with quick recovery
24✅ >50% renewable integration
25✅ Basic maintenance planning
26✅ Some cost optimization
27✅ Basic security measures
28✅ Acceptable service quality
29
30КРИТИЧЕСКИЕ FAIL УСЛОВИЯ:
31❌ Frequency >±1Hz (grid collapse!)
32❌ Voltage >±10% (equipment damage!)
33❌ >5 minute outage (customer impact!)
34❌ Security breach (critical infrastructure!)
35❌ Safety incident (personnel danger!)

📊 REAL-TIME DASHBOARD METRICS:

 1⚡ LIVE POWER GRID STATUS:
 2
 3INSTANT INDICATORS:
 4🟢 Grid Frequency: 50.00Hz ±0.05Hz (EXCELLENT)
 5🟡 System Load: 85% of capacity (HIGH but stable)
 6🟢 Voltage Profile: 230V ±2% (OPTIMAL)
 7🔵 Power Factor: 0.98 (EXCELLENT efficiency)
 8🟢 Renewable Mix: 78% (OUTSTANDING sustainability)
 9
10TRENDING ALERTS:
11⚠️  Load increasing 2%/hour - peak predicted in 3 hours
12✅ Battery storage 95% charged - ready for peak shaving
13🔧 Generator #3 efficiency down 3% - maintenance recommended
14📈 Energy prices rising - activate demand response in 1 hour
15🌤️ Weather: sunny, wind 15 km/h - optimal renewable conditions
16
17EMERGENCY STATUS:
18🚨 NONE - All systems GREEN
19🛡️ Security: All firewalls operational
20🔒 Physical: All substations secure
21💾 Backup: All systems replicated
22📡 Communications: 100% network uptime

🔥 ЭНЕРГЕТИЧЕСКОЕ ЗАКЛЮЧЕНИЕ:

Спринт 31 создал ЭНЕРГЕТИЧЕСКИХ ИМПЕРАТОРОВ! От milliwatt LED до megawatt power plants - полное доминирование над электричеством! Высокое напряжение покорено, промышленная мощь укрощена, smart grid построена!