IoT PowerHub. Як я створив промислову IoT-систему з нуля

💡 Усі статті, обговорення, новини про Front-end — в одному місці. Приєднуйтесь до Front-end спільноти!

Мене звати Олександр, я розробник зі стеком Node.js, PHP, Laravel, React та Docker. Це моя перша стаття на DOU (сподіваюся, не остання — якщо сподобається нашій шановній українській айті-спільноті). В ній я розповідаю про те, як видумував черговий велосипед, на який пішли місяці розробки: від дизайну електронної плати до production-ready IoT-платформи, яка контролює промислові об’єкти через GSM/GPRS.

Можливо, це буде цікаво розробникам, які хочуть ознайомитись із черговим «чудом техніки» в IoT-системах, а також тим, хто вагається між готовими рішеннями та self-hosted альтернативами.

Що я розумію під «промисловою IoT системою»?

Коли я кажу «промислова система», я маю на увазі три аспекти:

1. Промислова сфера застосування — система працює в реальних промислових умовах: теплиці, насосні станції, склади. Не хобі-проект, а щось що людина використовує щодня для заробітку.

2. Промислового рівня якості — система повинна бути надійною:

— 99.8% аптайм при наявності живлення

— Автоматичне відновлення при відмовах

— Моніторинг 24/7

— Логування всіх операцій

3. Масштабування — плата розроблена так щоб її можна було тиражувати партіями. Не «одна штука», а «готовий продукт для 100+ пристроїв».

Моя система прагне до всіх трьох, але повністю не досягає промислового рівня безпеки (XOR шифрування це не військова криптографія), немає тривалого більше 6 місяців використання в реальних умовах. Та я до цього йду, тож давайте по порядку.

Контекст: чому я почав цей проєкт

До цього в мене вже були схожі проєкти — моніторинг рівня Скрапленого газу (там реалізував свій ModbusRTU на атмегі 328), термінал знижок. Та усі вони працювали в одну сторону, тобто зв’язатись з ними не було можливості. Одного разу мені пощастило працювати з командою, яка управляла багатьма промисловими об’єктами — теплицями, насосними станціями та складами через розумні GSM-розетки власного виробництва. Там була одна розетка, яка спілкувалась за допомогою вебсокет-з’єднання з одним каналом для датчика. Таким чином вони вирішували проблему: як віддалено керувати обладнанням і моніторити датчики 24/7, коли немає стабільного інтернету, але є мобільний зв’язок,. Проєкт на ринку більше 7 років.

Мене теж цікавила можливість спілкування з залізякою, а не лише отримання від неї даних. До того ж не покидала думка, чому лише одна розетка. А що, якщо їх зробити більше? Адже ніг в контролера багато. А що, якщо взагалі взяти і розширити за допомогою регістру зсуву?

Звісно, на ринку є варіанти:

  • Промислові PLC-системи — дорогі ($5000+), складні налаштування, потрібен спеціаліст.
  • Arduino + WiFi — дешево, але WiFi не працює далеко від маршрутизатора.
  • Online IoT сервіси — залежність від хмари, витрати на трафік, питання приватності даних.
  • GSM модемні системи — працюють всюди, де є сигнал, але часто архаїчні інтерфейси.

Я вирішив: чому б не зробити своє, з нуля? З повним контролем, розумною ціною та гнучкістю.

Архітектура: як все влаштовано

Система складається з кількох основних компонентів, які працюють разом:

Пристрій:
— Raspberry Pi Pico (MCU).
— SIM800L (GSM/GPRS).
— Датчики (температура, тиск, рух).
— 4 реле (керування обладнанням).

↓ (MQTT через GSM)

Back-end (Node.js + Express):
— MQTT Broker (Aedes).
— Socket.IO для real-time.
— PostgreSQL база даних.

↓ Front-end (Next.js + React):
— Admin-панель з моніторингом.
— Управління пристроями.
— Графіки та статистика.

Tech Stack: Raspberry Pi Pico → C++ → MQTT → Node.js/Express → PostgreSQL → Next.js/React → Docker.

Вибір Hardware: чому саме ці компоненти

Мікроконтролер: Raspberry Pi Pico

На початку було питання: Pico vs ESP32 vs Arduino?

Я проаналізував і порівняв:

Критерій

Pi Pico

ESP32

Arduino Uno

Ціна

$4

$8

$12

Ядер

2

2

1

RAM

264KB

520KB

2KB

GPIO

26

34

14

Flash

2MB

4MB

32KB

WiFi

Для нас

Надто сильний

❌ Слабкий

Чому саме Pico:

  • Дешевше — $4 це дешевше за конкурентів.
  • Достатньо ОЗУ — 264KB для MQTT черги та буферів.
  • Два ядра — одне для основної логіки, друге для GSM-операцій (паралелізм без блокування).
  • PIO State Machines — можна обробляти UART без блокування основного потоку.
  • Немає WiFi — це плюс, бо ми все одно використовуємо GSM через SIM800L.

GSM Модуль: SIM800L

Для комунікації я вибрав SIM800L, а не SIM7600 (LTE):

  • GPRS достатньо — для MQTT потрібна невелика пропускна спроможність, LTE overhead не потрібен.
  • Нижче споживання — 300mA в середньому vs 2A у SIM7600.
  • Простіший AT command set — менше команд, легше реалізувати.
  • Дешево — $5 vs $20.

Інші компоненти

AT24C256 EEPROM (32KB, I2C):

  • Зберігає стан реле при вимкненні.
  • 1 мільйон циклів запису (vs 10K у Flash Pico).
  • 100 років збереження даних.
  • Займає всього 2 піни (I2C).

BMP180 (датчик температури/тиску):

  • Точний, мала енергія.
  • I2C-інтерфейс (можна каскадувати інші датчики).
  • $2-3 вартість.

74HC595 (shift register):

  • Керую 8 LED через 3 піни (замість 8).
  • Можна каскадувати до 64+ LED.
  • Економія GPIO значна.

4 оптоізольовані реле:

  • До 10A кожне (достатньо для насосів, компресорів).
  • Оптична ізоляція (захист від спалахів).

Прошивка: як я реалізував основну логіку

Архітектура двох ядер

Це була найцікавіша частина розробки. Pi Pico має два ядра Cortex-M0+, і я використав кожне для своєї задачі:

Core 0: основна логіка

  • Heartbeat моніторинг (кожні 30 сек).
  • Обробка команд з черги.
  • Читання датчиків (кожні 10 сек).
  • Анімації LED-індикаторів.

Core 1: GSM-обробник

  • Черга AT-команд.
  • Парсинг відповідей від модема.
  • Моніторинг мережі.
  • Таймаути операцій.

Чому така архітектура? Якщо я читаю дані з датчика (30ms) в основному потоці, то GSM-операція (може зайняти 2 сек) не заблокує критичну команду реле.

Пріоритетна черга команд

Одна з найважливіших частин — розподіл пріоритетів:

CRITICAL (Реле):

  • Виконується НЕГАЙНО ⚡
  • Обходить чергу
  • Приклад: «relay:22:on» (вмикаємо насос)

HIGH (Датчики):

  • Виконується в чергу, але першим.
  • Приклад: «readBMP:temperature».

NORMAL (Статус):

  • Звичайна обробка.
  • Приклад: «getUptime».

LOW (GSM-операції):

  • Може чекати довго.
  • Приклад: «getSignalQuality» (можемо дізнатися за 10 сек).

Чому це критично? Уявіть: користувач натискає кнопку «увімкнути вентилятор», а модем якраз перевіряє баланс SIM-карти (2 секунди операція). Без пріоритетів вентилятор включився б з затримкою 2+ сек.

Власна реалізація MQTT без бібліотек

На MCU пам’ять критична. Стандартна бібліотека PubSubClient займає 8KB SRAM (це 3% всієї доступної пам’яті на Pico!).

Я вирішив реалізувати MQTT самостійно. Це дало:

  • Контроль пам’яті — мінімалістичний код.
  • Розуміння протоколу — MQTT це просто байти, нема ніякої магії.
  • Оптимізація — мій код робить тільки те, що потрібно (CONNECT, PUBLISH, PINGREQ).

Основна структура MQTT CONNECT пакета:

  • Байт 1-2: Fixed header (0×10, довжина)
  • Байт 3-6: «MQTT» (4 байти)
  • Байт 7: Protocol level (0×04 = версія 3.1.1)
  • Байт 8: Connect flags
  • Байт 9-10: Keep alive (60 сек)
  • Решта: Client ID (IMEI модема)

Мій код генерує це програмно замість використання бібліотеки.

Шифрування з динамічною сіллю

Безпека важлива, але на MCU немає місця для AES. Я використав XOR з динамічною сіллю:

String encryptMessage(String message) {
  // Генеруємо сіль з аналогового шуму (IMEI + ADC)
  String salt = generateSaltFromNoise(); 
  // XOR з IMEI як ключ
  String encrypted = xorEncrypt(message + salt, IMEI_KEY);
  // Додаємо довжину солі (4 байти)
  encrypted += String(salt.length()).padStart(4, '0');  
  return encrypted;
}

Це не військове-grade шифрування, але захищає від:

  • Простих перехопленнь (сніфінг мереже).
  • Повторних атак (сіль робить кожне повідомлення унікальним).
  • Випадкового відкриття даних.

Уточнення: XOR з ключем (IMEI) — це все-таки небезпечно. Якщо хтось перехопить 2 повідомлення, він може витягти IMEI. «Динамічна сіль» з ADC-шуму — це не криптографічна сіль. ADC-шум передбачуваний. Тож це більше ілюзія безпеки, але все ж таки краще, ніж нічого.

Persistence: збереження стану при вимкненні

Через можливість раптових вимкнень (розрив живлення, GSM-перезагрузка), я додав EEPROM persistence:

struct SavedState {
  uint16_t magic;        // 0xA55A - контроль цілісності
  uint8_t version;       // Версія схеми (для оновлень)
  uint32_t bootCount;    // Скільки разів перезавантажилось
  uint8_t relayBits;     // 4 реле = 4 біти! (економія)
  uint8_t ledValue;      // Стан LED
  uint16_t checksum;     // CRC16
};

При вимкненні: saveState() — записую стан в EEPROM. При включенні: loadState() — відновлюю реле у попередній стан.

Це важливо, бо якщо у когось в теплиці був увімкнутий вентилятор, то при відновленні живлення він має залишитися увімкнутим.

Back-end: Server-side розробка

Стек технологій

Я використав:

  • Node.js 20 з Express.
  • Aedes — легкий MQTT broker на JavaScript.
  • Socket.IO — WebSocket для real-time оновлень.
  • Prisma — ORM з TypeScript типами
  • PostgreSQL 15 — база даних.

MQTT Broker: чому власний, а не Mosquitto?

На початку я розглядав запустити Mosquitto в Docker-контейнері. Це стандартне рішення. Але я вибрав Aedes (JavaScript MQTT broker), бо:

  1. Все в одному процесі — back-end + broker в одному Node.js-процесі, менше контейнерів, простіше deploy.
  2. Інтеграція з Express — можу прямо в route handler перевірити з’єднання пристроїв.
  3. Custom логіка — я можу додати свою логіку аутентифікації, авторизації, логування.
// backend/src/mqtt/broker.js
const aedes = require('aedes')();
aedes.authenticate = (client, username, password, callback) => {
  const pass = Buffer.from(password, 'base64').toString();
  const user = users[username];
  if (user && user.password === pass) {
    return callback(null, true);
  }
  callback(new Error('Auth failed'), false);
};
aedes.authorizePublish = (client, packet, callback) => {
  // Тільки пристрої можуть публікувати в heartbeat
  if (packet.topic.startsWith('heartbeat')) {
    return callback(null);
  }
  callback(new Error('Unauthorized'));
};

Heartbeat-моніторинг: як я дізнаюся, що пристрій offline

Кожні 30 секунд пристрій надсилає heartbeat — коротке повідомлення з даними:

{
  "type": "heartbeat",
  "imei": "862202050164352",
  "uptime": 3600,
  "sensors": {
    "bmp180": {
      "temperature": 23.5,
      "pressure": 1013.25
    }
  },
  "relays": {
    "relay22": { "state": true },
    "relay23": { "state": false }
  },
  "diagnostics": {
    "free_heap": 48000,
    "signal_quality": 23,
    "rssi": -95
  }
}

Логіка моніторингу:

Якщо heartbeat не прийде протягом 90 сек (3 пропущені):

  1. Пристрій був переведений в статус offline.
  2. Адміністратор отримує алерт (Telegram, email).
  3. Система логує це в БД для статистики uptime.

Якщо пізніше heartbeat повернулося — пристрій знову online.

За цими даними я потім можу обчислити:

  • Uptime % = час онлайн / загальний час.
  • Аномалії = температура підвищилась до 30°C (раптовий перегрів?).
  • Тренди = температура повільно зростає (проблема з вентиляцією?).

Real-time оновлення через WebSocket

Коли пристрій надсилає heartbeat, я одразу публікую дані всім підключеним адміністраторам через Socket.IO:

// backend/src/socket/events.js
aedes.on('publish', (packet) => {
  const data = JSON.parse(packet.payload);
  if (packet.topic === 'heartbeat') {
    // Одразу оновлюємо UI всіх адміністраторів
    io.emit('sensor:data', {
      device_id: data.imei,
      temperature: data.sensors.bmp180.temperature,
      pressure: data.sensors.bmp180.pressure,
      timestamp: Date.now()
    });
  }
});
На фронтенді:
const socket = io();
socket.on('sensor:data', (data) => {
  // Графік оновлюється в реальному часі
  updateChart(data);
});

Це означає: якщо температура в теплиці змінилася — адміністратор бачить це в реальному часі, без перезавантаження.

Обробка команд: критичні відправляються НЕГАЙНО

Коли адміністратор клікає кнопку «увімкнути реле», я надсилаю команду з QoS=2 (гарантована доставка):

// backend/src/api/relays.js
async function toggleRelay(deviceId, relayId, state) {
  const command = {
    type: 'relay_command',
    relay_id: relayId,
    state: state
  };
  // MQTT QoS=2 = гарантирована доставка
  aedes.publish({
    topic: `command/${deviceId}`,
    payload: JSON.stringify(command),
    qos: 2,
    retain: false
  });
  // Логуємо для аудиту
  await prisma.commandLog.create({
    data: {
      device_id: deviceId,
      command_type: 'relay',
      relay_id: relayId,
      state: state,
      timestamp: new Date(),
      user_id: req.user.id
    }
  });
}

Front-end: Admin Panel розробка

Stack: Next.js + React + Tailwind

Я використав Next.js, бо він дає:

  • SSR — server-side rendering для швидших page loads.
  • API Routes — back-end-логіка в Next.js без окремого Express server.
  • TypeScript — типізація.
  • Middleware — аутентифікація на всіх сторінках.

Структура сторінок

pages/dashboard/
├── index.tsx              # Головна з метриками
├── devices/
│   ├── index.tsx          # Список пристроїв
│   └── [id].tsx           # Деталі пристрою
├── monitoring.tsx         # Real-time графіки
├── database.tsx           # Управління БД
├── automation.tsx         # Node-RED сценарії
└── users.tsx              # Управління користувачами

Dashboard: Метрики

На головній сторінці я показую stat cards:

export default function DashboardPage() {
  const { devices } = useDevices();
  const { statistics } = useStatistics();
  const onlineCount = devices.filter(d => d.online).length;
  const offlineCount = devices.length - onlineCount;
  return (
    <div className="grid grid-cols-4 gap-4">
      <StatCard 
        title="Пристроїв онлайн" 
        value={onlineCount}
        trend={`${offlineCount} офлайн`}
        status={offlineCount === 0 ? 'success' : 'warning'}
      />
      <StatCard 
        title="Датчиків активних"
        value={devices.reduce((sum, d) => sum + d.sensors.length, 0)}
      />
      <StatCard 
        title="Алертів за 24ч"
        value={statistics.alerts24h}
        trend="-5% від вчора"
        status={statistics.alerts24h > 10 ? 'danger' : 'normal'}
      />
      <StatCard 
        title="Аптайм системи"
        value="99.8%"
        status="success"
      />
    </div>
  );
}

Управління реле: UI для керування обладнанням

Для кожного пристрою я показую його реле з кнопками управління:

function RelayControl({ deviceId, relay }) {
  const [loading, setLoading] = useState(false);
  const [state, setState] = useState(relay.state);
  const toggle = async () => {
    setLoading(true);
    try {
      const response = await fetch(`/api/devices/${deviceId}/relay`, {
        method: 'POST',
        body: JSON.stringify({ 
          relay_id: relay.id, 
          state: !state 
        })
      });
      if (response.ok) {
        setState(!state);
        showNotification('Команда надіслана на пристрій');
      }
    } finally {
      setLoading(false);
    }
  };
  return (
    <button
      onClick={toggle}
      disabled={loading}
      className={`px-4 py-2 rounded ${
        state ? 'bg-green-500' : 'bg-gray-300'
      }`}
    >
      {relay.name}: {state ? 'ON' : 'OFF'}
    </button>
  );
}

Real-time графіки: температура в реальному часі

Для моніторингу я використав Recharts для графіків та Socket.IO для оновлень:

function TemperatureChart() {
  const [data, setData] = useState<ChartData[]>([]);
  const socket = useSocket();
  useEffect(() => {
    socket.on('sensor:data', (newData) => {
      setData(prev => [...prev, {
        timestamp: new Date(newData.timestamp),
        temperature: newData.temperature,
        pressure: newData.pressure
      }].slice(-100)); // Тримаємо останні 100 точок
    });
    return () => socket.off('sensor:data');
  }, [socket]);
  return (
    <LineChart data={data}>
      <CartesianGrid strokeDasharray="3 3" />
      <XAxis dataKey="timestamp" />
      <YAxis />
      <Tooltip />
      <Legend />
      <Line 
        type="monotone" 
        dataKey="temperature" 
        stroke="#8884d8" 
        dot={false}
        isAnimationActive={false}
      />
    </LineChart>
  );
}

DevOps: Запуск в Docker

Я упакував все в Docker-контейнери для легкого запуску:

version: '3.9'
services:
  iot-database:
    image: postgres:15
    environment:
      POSTGRES_USER: iot_user
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: iot_system
    volumes:
      - postgres-data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
  iot-backend:
    build: ./backend
    environment:
      DATABASE_URL: postgresql://iot_user:${DB_PASSWORD}@iot-database:5432/iot_system
      MQTT_PORT: 1883
      NODE_ENV: production
    ports:
      - "3001:3001"      # Express API
      - "1883:1883"      # MQTT
      - "8083:8083"      # WebSocket MQTT
    depends_on:
      - iot-database
    restart: unless-stopped
  admin-panel:
    build: ./admin-panel
    environment:
      NEXT_PUBLIC_API_URL: http://iot-backend:3001
      NEXT_PUBLIC_SOCKET_URL: http://iot-backend:3001
    ports:
      - "3010:3010"
    depends_on:
      - iot-backend
    restart: unless-stopped
volumes:
  postgres-data:
Розробка:
docker-compose -f docker-compose.dev.yml up
Production:
docker-compose -f docker-compose.prod.yml up -d

Автоматизація: Node-RED

На цьому етапі я вирішив додати Node-RED для візуальної автоматизації без коду. Це дозволить операторам (не розробникам) створювати сценарії.

Приклад 1: автокліматизація теплиці

MQTT In [heartbeat]
  ↓
Function: Extract BMP180 data
  ↓
Switch: temperature > 30°C?
  ├─ YES → Relay: On (вентилятор)
  ├─ Wait: 5 хвилин
  ├─ Switch: temperature < 28°C?
  │   ├─ YES → Relay: Off
  │   └─ NO → Continue
  ├─ Relay: On (полив)
  └─ Telegram: Alert "Температура високо: 32°C"

Це означає: якщо в теплиці жарко, вмикаємо вентилятор. Через 5 хвилин, якщо ще жарко, включаємо полив. І сповіщаємо оператора.

Приклад 2: моніторинг рівня води

MQTT In [sensor data]
  ↓
Switch: water_level < 20%?
  ├─ YES → Relay: pump:on
  ├─ Wait: 30 хвилин
  ├─ Check: water_level > 80%?
  │   ├─ YES → Relay: pump:off
  │   │   └─ Email: "Бак успішно наповнений"
  │   └─ NO → Alert: "⚠️ Помпа не справляється!"

Числа: статистика проєкту

Метрика

Значення

Час розробки

6 місяців (part-time, ~10 год/тиждень)

Ліній коду

~15,000 (Wiring/С/C++, JavaScript, TypeScript)

Затримка команди

< 500мс у стабільній мережі GSM (2G). На слабкому сигналі (1 бар) може бути 2-5 сек."

Аптайм системи

99.8% (при наявності живлення)

Вартість залізяки

~$40 за один пристрій

Частота heartbeat

30 сек (оптимум між затримкою та трафіком)

Середнє споживання

300мА (без реле), до 2А при включеному реле

Тривалість батареї

~33 години при 10Ah батареї (без реле)

Досвід: Що я здобув у цьому проєкті

Технічні навички

Embedded Systems (C++):

  • Розуміння двоядерної архітектури та паралелізму.
  • UART комунікація з GSM-модемом на низькому рівні.
  • I2C та SPI-інтерфейси для датчиків.
  • Керування перериваннями та таймерами.
  • Оптимізація пам’яті — кожен байт рахується на 264KB.

IoT-протоколи:

  • Власна реалізація MQTT дала мені глибоке розуміння протоколу.
  • GSM AT Commands — як спілкуватись з модемом.
  • QoS та надійність доставки в нестабільних мережах.
  • Шифрування на слабкому залізі.

Back-end-архітектура:

  • Запуск власного MQTT Broker в Node.js.
  • Real-time комунікація через WebSocket (Socket.IO).
  • Пріоритетні черги завдань<./li>
  • PostgreSQL-оптимізація для часових рядів.

Full-Stack мислення:

  • Від схемотехніки до cloud-архітектури.
  • DevOps та Docker-контейнеризація.
  • Monorepo архітектура з Prisma ORM.
  • Type-safe розробка скрізь (TypeScript).

Архітектурні рішення

  1. Пріоритети вирішують — критичні команди мають виконуватися в БУДЬ-ЯКОМУ випадку, навіть якщо система завантажена.
  2. Контроль над залежностями — іноді своя реалізація краща за готову (пам’ять, контроль, розуміння).
  3. Паралелізм — двоядрова обробка дозволяє обробляти GSM-операції без блокування основної логіки.
  4. Persistence — стан має зберігатися при вимкненні (EEPROM).
  5. End-to-End мислення — важливо розуміти, як залізо взаємодіє з back-end, який взаємодіє з UI.

Виклики, з якими я зустрівся

Цей проєкт не був легким, оскільки знов-таки велосипеди, нестандартні рішення (можливо, через брак досвіду). І все ж покажу основні виклики:

Проблема 1: GSM-таймаути

Проблема: SIM800L іноді зависав на AT-команді на 10+ секунд. Це блокувало весь основний thread.

Рішення: реалізував timeout-механізм з перериванням та повторними спробами. На другому ядрі я слідкую за таймаутом, і якщо AT-команда не відповідає більше 3 секунд — перезавантажую модем програмно.

void handleGSMTimeout() {
  if (millis() - lastATCommand > GSM_TIMEOUT_MS) {
    // Модем не відповідає
    digitalWrite(GSM_RESET_PIN, LOW);
    delay(1000);
    digitalWrite(GSM_RESET_PIN, HIGH);
    // Очищаємо чергу, поновлюємо З'єднання
  }
}
Проблема 2: Нестабільне з'єднання MQTT
Проблема: Пристрій губив з'єднання коли сигнал стрибав з 4 бар на 1 бар.
Рішення: Додав automatic reconnect з exponential backoff:
unsigned long reconnectDelay = 1000; // 1 сек
const unsigned long maxReconnectDelay = 60000; // 1 хвилина
if (!mqttConnected) {
  if (millis() - lastReconnectAttempt > reconnectDelay) {
    mqttReconnect();
    lastReconnectAttempt = millis();
    reconnectDelay = min(reconnectDelay * 2, maxReconnectDelay);
  }
}
if (mqttConnected) {
  reconnectDelay = 1000; // Reset на успіх
}

Що таке «бари» сигналу

Бари (bars) — це показник сили GSM-сигналу, який показує, як близько ви до вишки мобільного оператора.

На практиці:

  • 📶📶📶📶 = 4 бари — Відмінний сигнал (близько до вишки)
  • 📶📶📶 = 3 бари — Хороший сигнал
  • 📶📶 = 2 бари — Слабкий сигнал
  • 📶 = 1 бар — Дуже слабкий сигнал (на межі)
  • = 0 барів — Немає сигналу (немає мережі)

Технічно (RSSI — Received Signal Strength Indicator):

SIM800L повідомляє сигнал як число від 0 до 31:

RSSI

дБм

Якість

31

-51 дБм

📶📶📶📶 4 бари

25-30

-60 до —55 дБм

📶📶📶 3 бари

15-24

-70 до —61 дБм

📶📶 2 бари

8-14

-80 до —71 дБм

📶 1 бар

0-7

< —80 дБм

Нема сигналу

Чому це проблема для мене

«Сигнал стрибав з 4 бар на 1 бар» — це означає:

  1. Пристрій був близко до вишки (4 бари = —51 дБм).
  2. Раптово переїхав подалі (1 бар = —75 дБм).
  3. MQTT-з’єднання розірвалось, бо мережа стала нестабільною.

На 1 барі:

  • ❌ Пакети можуть губитись.
  • ❌ З’єднання часто розривається.
  • ❌ Затримки зростають (200ms → 5000ms).
  • ❌ GSM AT команди можуть timeout’ати.

Як я це вирішив

Я додав automatic reconnect з exponential backoff — якщо з’єднання впало, пристрій спробує підключитись знову, але з наростаючими інтервалами:

// Перша спроба: 1 сек

// Друга спроба: 2 сек

// Третя спроба: 4 сек

// Четверта спроба: 8 сек

// ...

// До максимуму 60 сек

Це робиться, щоб не завалити мережу безліччю reconnect-запитів.

Проблема 3: витік пам’яті в MQTT

Проблема: на другому ядрі я створював String-об’єкти в циклі. Через деякий час вільна пам’ять впала з 100KB до 20KB.

Рішення: замінив String на char[] буфери фіксованого розміру:

// ДО (витік):
String response = "";
while (serial.available()) {
  response += (char)serial.read();
}
// ПІСЛЯ (стабільно):
char buffer[256];
int index = 0;
while (serial.available() && index < 255) {
  buffer[index++] = serial.read();
}
buffer[index] = '\0';

Проблема 4: затримка в MQTT QoS=2

Проблема: QoS=2 означає «guaranteed delivery» — модем чекає підтвердження від брокера. Це додає 500ms+ затримки.

Рішення: для реле я використовую QoS=2 з таймаутом, а для телеметрії QoS=0 (швидко, але може втратити):

// Реле = CRITICAL, гарантована доставка
aedes.publish({
  topic: `command/${deviceId}/relay`,
  qos: 2,  // Чекаємо підтвердження
  payload: JSON.stringify(command)
});
// Télémétrie = можемо потерять кілька повідомлень
aedes.publish({
  topic: `telemetry/${deviceId}`,
  qos: 0,  // Без чекання, швидко
  payload: JSON.stringify(sensorData)
});

Результати на сьогодні

За 6 місяців розробки я маю:

  • Прототип в лабораторних умовах — повністю розроблений, протестований, готовий до development.
  • Готову платформу — можу розгорнути новий пристрій за 30 хвилин.
  • Документацію — схемотехніка, firmware guide, back-end docs.
  • Монітор архітектури — система правильно спроектована для масштабування.

Система готова до переходу в production на трьох об’єктах для довгострокового тестування перед розширенням.

Висновок

Цей проєкт не надто складний і його можна реалізувати, маючи певні навички в embedded та back-end-розробці. Що ж до мене, то це була мотивація самостійно розвести плату — нехай і таку примітивну. Бо в попередніх проєктах то робили досвідчені інженери-електронщики. Упорядкувати розкиданий код для залізяки в один проєкт, згадати відчуття від відчаю до «Оу, та я геній!».

Вийшло зібрати усе корисне, що вдалось напрацювати в моїй Ардуїноманії, майже фізично пощупати два ядра, попуяти :), написати статтю, яка мала бути доповненням — але вийшла раніше. Отримати зворотну реакцію, що надихає: адже хтось це прочитав, доповнив, виправив, дав пораду.

Саме такий діалог — це те, що рухає розробку вперед. Дякую спільноті та колективу DOU за таку можливість.

Маєте запитання або свій досвід — пишіть!

👍ПодобаєтьсяСподобалось17
До обраногоВ обраному6
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Те що автор створив корисний продукт — це чудово. Те що написав інформативну статтю — ще краще. А те що вчиться ефективно спілкуватись з різними людьми — взагалі ідеально. Правда над останнім ще треба попрацювати, побільше практики. Навчитись не реагувати на провокації заздрісників, на які не варто гаяти свій час та нерви поготів; відрізняти конструктивні об’єктивні та деструктивні суб’єктивні зауваження, через які немає сенсу дискутувати; зрозуміти, що не зобов’язаний давати визначення в статті кожного використаного слова; усвідомити, що у світі все відносне і немає чітких точних визначень та меж для всіх назв властивостей; ...

Міцного здоров’я, дякую. Найкращий коментар, навіть не те, що коментар, а знак від Всесвіту, що тре продовжувати і не зупинятись, що тре ділитись і не зважати. Не уявляєте на скільки я вдячний вам, за ці слова, хай Творець пошле Вам найкращі блага, які ви хотіли і які будуть Вам во благо

до речі, щоб не городити город з SIM800L
docs.particle.io/boron

ТЕО збс (бо неівпєнна економія):

Для комунікації я вибрав SIM800L, а не SIM7600 (LTE):

GPRS достатньо — для MQTT потрібна невелика пропускна спроможність, LTE overhead не потрібен.
Нижче споживання — 300mA в середньому vs 2A у SIM7600.
Простіший AT command set — менше команд, легше реалізувати.
Дешево — $5 vs $20.

ТТХ агінь, дайте два

Власна реалізація MQTT без бібліотек

чому не голі сокети і UDP (або не NB-IoT або MQTT-SN), бо реалізація не простіше?

Шифрування на слабкому залізі.

Це як розуміти? Ed25519 вже не тягне не кажучи про AES?

Безпека важлива, але на MCU немає місця для AES.

крім AES та XOR «не знаю, не чув»

якщо AT-команда не відповідає більше 3 секунд — перезавантажую модем програмно.

повно проблем які автор створив сам собі, і з якими успішно бореться, методом на кшталт: " якщо у вас синій екран Віндовс, то перезавантажте промислову систему"

Update:
На курсову роботу ще би потягнуло.

Update 2:
Чим більше читаю, тим більше прозріваю.

Дякую, це найкращий ваш коментар, усе чітко і зрозуміло, за посилання на контролер окрема подяка, не знав. Є там і голі сокети і управління з консолі, якщо до компа підключити і ще багато чого іншого там є. Так, компоненти підбиралися і щоб простіше було. Так, плату вперше розвів і вона працює. Так, маю брак досвіду в таких проектах, тому зазначив, що це велосипед. Але такі коментарі, як ваш дають як мінімум зрозуміти, як не тре робити. Хтось подивиться на мою систему і прочитає ваш коментар і зробить по вашому, хтось взагалі передумає таке робити. Можливо вас надихне написати свій топік чи статтю, як би ви правильно зробили. Бо технічних статей українською майже немає

Резюме:
Ефект Даннінга-Крюгера

Дякую, у вас найбільша кількість коментарів, ви мій самий палкий прихильник:)

(РУКАЛИЦЕ) Я не уявляю адекватного промислового виробництва яке допусте оце ардуіноподібне «шось» до чогось суттєвого в любому технологічному процесі. Хіба шо просто поржати. Або там головний інженер і технолог відсутні як класс, чи ідіоти. Ця конструкція проводків і текстоліту в ліпшому пропрацює, якщо її щоденно тикати паличками и смикати за проводки що повипадали, ну може півроку в теплому сухому зачиненому приміщеніі без вібрацій і якихось випромінювань. І це мова не йде вопще ні про які промислові стандарти, захист, безпеку і т.п. Ну а називати оце «промисловим рішенням» — то вже за гранню. Я вже мовчу, що навіть для так званого «пет-проекту» воно не дотягуе як за хардварною архітектурою, вибором компонентів, так і софтовою частиною. Про 5000 за PLC то вже просто не смішно, а дуже пєчально навіть для поточного рівня на цьому сайті

Так ви праві, звісно проводки, що випадають, то не рішення, на фото тестовий пристрій, для зручності у прод версії там конектори і нічого не відпадає і інше рішення по реле, по живленню і корпус. Розумію, чому вас це хвилює та не переживайте вже так, вас не примушують це використовувати. Стосовно ардуїно, то pro mini нормально себе показали і в жару і в мороз, думаю pi pico не підведе, до того ж сам текстоліт, можна використовувати, як відладочну плату для pi pico без макеток і проводів. Вже на цьому текстоліті роблю інше рішення. Особисто я дуже задоволений тим, що вийшло, зокрема ще й тому, що не робив хардварного рішення на сокетах. Стосовно півроку, то кайдзен ніхто не відміняв і не має межі для покращень. Дякую, що приділили стільки уваги та написали такий розгорнутий коментар

І так, ардуїно забрало вже значну частину ринку, навіть військові використовують, про що вказують у вакансіях. Часи асамблера відходять, приходять нові люди, нові рішення

«за відсутності кухарки кохають двірника», але це не означає, що забивати на кліматичне виконання, надійність, ЕМС сумісність і т.д. і т.п.

Ні хто про то не каже, та є закон хоча б того Парето, от і думайте. Стосовно двірника, ну і смаки у вас :)

як то кажуть багато «правил написані кров’ю», а тут виходить такий розумний і гарний: в маю смажим шашлики так як зустріти динозавра імовірність 50% (можна зустріти а можна ні), закони Парето, кококо ... не можете достойно оцінити, бо «жоден проект не дороблений» (оригінальна орфографія збережена), і взагалі, «не доріс ще до написання своїх опусів на DOU», а на хабрі «прийняли у спільноту авторів з першої же статті»

Дуже інформативно та не зовсім зрозуміло, до чого тут правила писані кровью

до промислового застосування зробленого юнатами на коліні

Світ змінився, подивіться навколо, бо ви видно застрягли десь на початку нульових

Так і є, у вас жоден проект недороблений, такий висновок я зробив з вашої сторінки. Тому вас і тригерить, що в когось виходить, а у вас лише голі ідеї, які навіть 10 років не змогли реалізувати

ось приклад промислової системи
www.youtube.com/watch?v=lrbZL-1AGE0
HW (електроніка, не механіка) пульта розроблено мною з нуля, а не куплене китайське брязкльце і з апломбом нацеплене на чоло

І що тут такого? І ви показуєте промисловий виріб, а я написав про промислову систему. Чи ви не розумієте різницю між виріб і система? У мене знайомий 3d принтер, чпу на фрезах, чпу на лазері зробив на ардуїнках і деталях з епіцентру вже років 6 працюють. А ще один знайомий переробив один мій прототип на повністю промислову систему, використовують вже 10 рік. Що саме заділо в мої статті, плата, серверне рішення чи все разом, що не так?

Та ясно, що ти і твій знайомий за ніч трьох баб кожен

Я кароч зрозумів, у людини немає ніякої освіти, поняття, що таке промислова система, як впринципі виглядає автоматика на підприємстві. А з його спічей він навіть ні темк ні тау не вивчав. просто джавастріптізьор.

Так, у мене немає технічної освіти. І я чесно в тексті зазначив — Цей проєкт не був легким, оскільки знов-таки велосипеди, нестандартні рішення (можливо, через брак досвіду). Але, система працює і це головне, усе інше час покаже

як впринципі виглядає автоматика на підприємстві

автоматика на предприємстві виглядає дууууууууже по різному, навіть на одному предприємстві(бо модернизують по наявности грошей).
бачив всяке, і нові сіменси, і шнайдери. але також бачив релейки яким 50+ років і все на ізоленті. бачив промислову виробничу лінію на Zilog Z80. установку де були x486 & pic16

так шо якось так

То ви кохайте двірника бо немає кухарки, а тут трьох баб. До речі те, що ви перейшли на особистості, та й конструктиву особисто й не було, багато каже про ваші навики спілкування, думаю ваші коментарі будуть корисні для потенційних роботодавців, для розуміння з якою особою прийдеться спілкуватись

І так, ардуїно забрало вже значну частину ринку, навіть військові використовують, про що вказують
у вакансіях

А то, что потом дрон взорвется в руках у оператора, так горе-«инженер» этого не увидит.

Це єдине застосування? А на простому atmega не взірветься?

Ты понимаешь, что даже один погибший это повод отдать «инженера» под трибунал и больше никогда не подпускать к технике?

До чого тут ардуіно. Надайте будь ласка відповідь на питання, якщо в нас діалог. Якщо це монолог, то не бачу потреби надавати відповідь на ваші коментарі

о, Жека вже тут по вухах їздить 😂
так а чо дрон на ардуіно має взірватись? Бо ти так вигадав?
чи ти знов почнеш нити про міліони плат і власний завод з їх виготовдення?

о, Жека вже тут по вухах їздить 😂
так а чо дрон на ардуіно має взірватись? Бо ти так вигадав?
чи ти знов почнеш нити про міліони плат і власний завод з їх виготовдення?

Пионер — иди в ... свой кружок «очумелые ручки».

Про 5000 за PLC то вже просто не смішно, а дуже пєчально навіть для поточного рівня на цьому сайті

байки для першокурсниць із забитого податками села без інтернету
www.automationdirect.com/...​open_(arduino-compatible

може то мені почати розписувати всі свої пет проекти починаючи від станціх юних техніків ...

Гарна ідея, такого контенту не хватає в укрнеті. Хтось к ваших проектах знайде ідею, а хтось натхнення. Так що, особисто я, залюбки почитаю

Щось мені підказує, що жоден пет проект не дороблений і існує або як ідея, або непотріб

Промислові PLC-системи — дорогі ($5000+)

якось випустив це з виду.
але от значно дешевше $5000
www.se.com/...​ct-smart-relays/#products

Або ті ж овени, ПЛК-200 коштує 16 тисяч. Це 400 долларів. Можна пошукати ще ПЛК-100 на яких написано ще ОВЕН, а не акутек і взяти ще дешевше. ПР200 реле програмоване взагалі 9000 коштує. Це 200 бачей, як і шнайдери, але у овена буде більше функцій. Якщо не йметься прям ардуйні запихати. У ардуїно є серія опта, за 150 долларів вже готовий контроллер на дін рейку. І це ми ще не згадуємо про китайську автоматику, тіж вуксі хіндже, які взагалі від 30 доларів стартують, і являються все ще краще, за саморобну срань на ардуїнах.

Дякую за пізнавальний коментар. Та ваші рішення, що ви пропонуєте можуть по gsm на сокетах, датчики в них вже є? Срань на ардуїно то для стариганів, які живуть ще у 80, плати ардуїно відтестовані на мільйонах проектів протягом десятеліття. Окрім того ардуїно злилась з Qualcomm і вийшло рішення ардухно уно на лінукс. Та особисто мені хотілось все таки на pi pico, на ньому майже немає проектів, а він навіть TensorFlow Lite (TFLite) може. І це ви ще не бачили СКУД систему на Orange pi яку я розробив :) і яка вже 3 рік працює в офісному центрі, правда плату там електронщик розводив

Срань на ардуїно то для стариганів, які живуть ще у 80, плати ардуїно відтестовані на мільйонах проектів протягом десятеліття.

Відтестовані на проектах аля блінк, хелоу ворлд, і курсова робота на тему «Інформаційно вимірювальна система „Метеостанція на компонентах ардуїно“»

Ото вже вас пучить :) Все залежить від потреб, якщо вам потрібно перевезти 2 валізи ви ж не наймете вантажі перевозки, а візьмете таксі. Точно так же і тут, якщо є потреба в простому і надійному рішенні, це ж не для атомної станції. Тут потрібно керувати кліматичною системою в теплицях і цього рішення достатньо для багатьох інших. Змиріться, що такі специ як ви з часом будуть незатребувані, бо будь який школяр буде таке робити за декілька днів, тож побережить нерви. Хоча звісно коментарі пишіть, бо коментарі то вже, як окремий вид мистецтва. Хто б що не казав та ардуїно забрало левову частину ринку. Та і що таке Ардуїно? В першу чергу це зручний завантажувач коду, купа бібліотек, усе безкоштовно. Майже з будь якої атмеги та багатьох stm32 можна зробити ардуїно прошивши завантажувач. Тож зрозумів, що ви мало обізнані з технологіями тому втрачаю інтерес спілкування з вами

Я шось випав з цього спіча.

Змиріться, що такі специ як ви з часом будуть незатребувані

Ну куди уж там, нам. Я вже незатребуваний, мене замінив АІ.

бо будь який школяр буде таке робити за декілька днів

Я не сумніваюсь, спочатку школярі будуть робити за декілька днів, а потім я це буду перероблювати за декілька тисяч долларів плюс закупка обладнання. Я просто цю фігню вже проходив, тільки не з школярями, а з дідами. Скіко дідового колхозу було перероблено, діди просто, як і діти люблять ардуїни і не тільки, ще більше вони люблять низькоякісну радянську розсипуху (ваєнная прийомка же) і вимірювальні прилади бо совєтскає какчество , а те що номінал написаний на розсипусі, і те що ти наміряв не радянським прибором має розброс в 40% і японська приблуда зроблена інженерами, а не совками тупо не буде працювати як треба їм пох, і не люблять читати книжки, бо досвід трейдмарк.

Тож зрозумів, що ви мало обізнані з технологіями тому втрачаю інтерес спілкування з вами

З технологіями промисловості якраз то я ознайомлений дуже добре, і оп оп, там ніяких ардуїн не використовується, і тим паче вайрінга і ардуїно бібліотек. Ардуїно вайрінг туди ж рп2040 мікропітон, туди ж energia від TI, існує лише для одного, навчати дітей початкової-середньої школи, основам електроніки, моргати світлодіодами і збирати там робособак з фанери, і то як і у випадку з навчанням дітей програмуванню на паскалі, їх потім приходиться перенавчати, бо вайрінг вчить їх абсолютно порочним практикам, які в реальній роботі шкідливі.

Дякую за конструктив. Про дідів повністю з вами згоден. Та ще раз зазначу, що це працює і цього достатньо, кайдзен ніхто не відміняв. До того ж, дуже люблю читати книжки

Серверне рішення до нього скільки буде коштувати, а по там вже є, а він по gsm? А загалом цікаво, дякую, по свободі більш детально розгляну. Та хотілось все таки на pi pico, на ньому майже немає проектів, а він навіть TensorFlow Lite (TFLite) може

Ага класні штуки. Мій пристрій має 4 виходи на реле прямих і 8 на сдвиговому регістрі на реле керування світлом. І вони серверне рішення наче не дають з собою

Вітаю! Як я зрозумів то реле постійно утримується якщо треба тримати увімкненим навантаження? Якщо так, то чому не розглянули варіанти з пусковими реле які б самі себе утримували пока є живлення? Це б надало змогу тільки короткочасно вмикати реле на платі аби увімкнути/вимкнути навантаження, але в такому випадку б потрібне було 2-ге реле для вимкнення

Цікава ідея, не знав про існування такого варіанту.

Я трохи одрукувався і мав на увазі магнітний контактор. Але суть та сама. Часто використовують на промислових об’єктах де треба запустити навантаження кнопкою і так само вимкнути. От тут роль кнопок виконують 2 реле в девайсі

Дякую, дуже цікава і якісна стаття і класний досвід.

Дякую, за Ваш теплий та надихаючий коментар

Цікаво чи є на доу перевірка на ботів, оскільки деякі акаунти досить сильно тим пахнуть і на жаль розносять свій сморід в коментарях

Є підтвердження профілю (не весь контент можуть коментувати непідтверджені профілі) і кнопка «Поскаржитись на коментар». Поки так.

Дякую, буду шукати кнопку. Бо в мене тільки кнопки Відповісти і Підтримати

Знайшли? Якщо що, допоможемо)

Вона з’являється на hover на тих двох конпках — зправа квадратик із «!» :)

Дякую. На мобільному якось мабуть інакше

Це помилкове твердження що непідтверджені профілі завжди є ботами У людей має бути право анонімності в інтернеті

Для того щоб в коментарях писати, що завгодно?

Так ніхто й не каже, що вони боти. Їхні акаунти не підтверджені.

Спасибо, мне статья понравилась. Для новичков в эмбедед довольно интересно, так как есть и описание технических моментов, нюансов и подводных камней, описан стек и причина выбора железа. Нравится что все очень бюджетного и действительно может применяться как раз в наших мелких предприятиях, где платить за корпоративные решения, то легче мануальщика взять на работу.
А уж учитывая что Доу скатился лишь до повесточки то видеть техническую статью это прям круто.

Спасибо, неожиданно, по этому приятнее в двойне. Видимо укрнету этот сегмент не нужен. Еще раз спасибо, ваш комментарий, тонкий луч света в океане тьмы негатива

Ох уж цей ІОТ, я просто надіюсь, що згадування промислового рівня, це просто постіронія.

постіронія

а от якби там кнопка «глобус та старт» були... ото бувби рівень...)

ох вже ті цеглазікі, все їм та зразу, а то обговорюють якісь iot з mqtt незрозумілим, непорядок...)

Нет это не ирония. Хотя очень иронично читать комментарии про иронию, с глухого и видимо специально для таких случаев созданного аккаунта

Дякую усім коментаторам, що дали зрозуміти, що наступні заплановані статті про цю поробку не варті часу та не доросли ні технічно ні поетично до необхідного рівня.Та спробувати варто було. Дякую усім за науку

А ціль яка була, отримати 100500 лайків з котиками, почесати ЧСВ, похвалитися як розумний та кмітливий?

Питання для роздумів вам:
Як гадаєте, чим «промислова» система відрізняється від не промислової?
Чому ціна промислової набагато вища?
Чому ваша система не може називатись промисловою?
Що треба зробити щоб вона могла стати промисловою?
Яка тоді буде її ціна?

Дякую за такий цінний коментар та те, що не пройшли повз і навчили мене думати. Бо звісно, в міру своє обмеженості світогляду, щось я не задумувався, а що воно таке та промислова система, тож якщо буде ваша ласка поясніть. А я ж керувався тим, що це пристрій який відповість на питання бізнесу як виробляти більше і заробляти більше, як витрачити менше, буде надійним та простим в монтажі і обслуговуванні не буде порушувати ліцензії, відповідати діючим нормам і правилам, ну якось так. Та не судіть мене строго, бо я в тому не дуже розумію хоч і зробив декілька пристроїв які навіть були допущені для роботи в вибухонебезпечних зонах, а зроблені на ардуїнках та компонентах з аліекспрес, добре що ваш коментар вніс ясніть. Ще раз дякую за конструктив, підтримку, а головне за науку, якої так не вистачає на просторах укрнету і який дав мені зрозуміти, що я не доріс ще до написання своїх опусів на DOU може піду спробую пописати на Medium, цікаво що на ХаброХабр де мене прийняли у спільноту авторів з першої же статті в коментарях мало повчають, жаль що війна внесла свої корективи і я там більше не пишу

вам діло кажуть 🤔
хочете продати — спробуйте без іронії пояснити нетехнарю що воно таке, для чого, і чим краще за аналоги
..........
уточнення значення слів — це нормально

Що саме кажуть? Можливо плутаються терміни комерційна та промислова. Якщо її використовують у тепличному господарстві умовно на 10000 рослин це вже промислова система чи ще ні? А якщо 10 користувачів на потужностях по 100 умовних рослин це вже промислова? А якщо є пред замовлення на 100 таких пристроїв це вже комерційна, промислова чи любительська. А якщо сервер розрахований на керування 10 000 таких пристроїв то любительська розробка, промислова, комерційна чи це вже стартап. Тож перед тим як, повчати когось як тре назвати статтю, давайте визначимось з терміном, що таке промислова система. А так то лише аби щось написати. Окрім того Вельмишановний пане, розтлумачте мені недолугому, де я то рекламую в статті чи пропоную комусь купити, зокрема мені цікаво, чому у статті з умовним нахилом на технічність тре пояснювати комерційну привабливість, буду дуже вдячний

давайте визначимось з терміном, що таке промислова система

ок, слухаю уважно

мені цікаво, чому у статті з умовним нахилом на технічність тре пояснювати комерційну привабливість

вище Ви написали:

А якщо є пред замовлення на 100 таких пристроїв це вже комерційна, промислова чи любительська. А якщо сервер розрахований на керування 10 000 таких пристроїв то любительська розробка, промислова, комерційна чи це вже стартап

тобто допускаєте, що вашою системою будуть користуватися інші люди...
1) чому вони могли б захотіти цим користуватися?
хто ці люди? що вони роблять?
(тобто стандартне маркетингове дослідження... цільова група... і т.д.)

2) як ви зможете (і чи захочете) виготовити кілька таких пристроїв, не продаючи їх ?

а якщо захочете продати... див. п.1

ось що пише чатджпт:

У статті **IoT PowerHub. Як я створив промислову IoT‑систему з нуля** на сайті DOU згадано термін *«промислова система»* кілька разів, але **чіткого формального визначення** цього терміну автором **не надано**.
...
... що можна сказати:

* Автор не дає точного визначення «промислової системи» (наприклад, «це система, яка...» з чіткими параметрами).

* Ми можемо **виділити** з тексту орієнтовні характеристики, які автор вважає ознаками «промислової системи»:

1. Надійність і стабільність (наприклад, uptime згадано: 99,8 %) ([DOU][1])
2. Можливість керування обладнанням та моніторингу даних (датчики, реле) через GSM/GPRS, навіть коли немає стабільного інтернету. ([DOU][1])
3. Простота розгортання / використання у виробничих або комерційних умовах (наприклад, «готова платформа» → «можу розгорнути новий пристрій за 30 хвилин»). ([DOU][1])
4. Контроль над архітектурою («від пристрою до back-end до UI») і орієнтація на масштабування. ([DOU][1])
5. Бюджетна альтернатива промисловим PLC-системам (дорогим) — тобто автор прагне зробити «промислову» систему доступнішою за ціною. ([DOU][1])

* Але ці пункти — **інтерпретація** зі змісту тексту, а не авторське визначення.

Як викладач, я б висловив так: **Ні**, в статті **немає чіткого формулювання**, що саме автор має на увазі під «промислова система». Є лише контекстуальні підказки.
.......................

додам...
чому (на мою думку) важливо чіткіше сформулювати, що мається на увазі під словами «промислова система» ?

А щоб краще зрозуміти запит замовника...
І, можливо, з цим же якось пов’язані і технічні характеристики виробу? 🤔

Дякую за конструктив, нарешті до мене дійшло, у чому невдоволення. Доповнив статтю наступним змістом:

Що я розумію під «промисловою IoT системою»?
Коли я кажу «промислова система», я маю на увазі три аспекти:

1. Промислова сфера застосування — система працює в реальних промислових умовах: теплиці, насосні станції, склади. Не хобі-проект, а щось що людина використовує щодня для заробітку.

2. Промислового рівня якості — система повинна бути надійною:
— 99.8% аптайм при наявності живлення
— Автоматичне відновлення при відмовах
— Моніторинг 24/7
— Логування всіх операцій

3. Масштабування — плата розроблена так щоб її можна було тиражувати партіями. Не «одна штука», а «готовий продукт для 100+ пристроїв».

Моя система прагне до всіх трьох, але повністю не досягає промислового рівня безпеки (XOR шифрування це не військова криптографія).

це пет-проект, рівень радіогуртка, а не промислової системи.
тут більш досвіченіші дають поради, але ж вони не тому що бажають добра, а щоб знецінити

а головне за науку, якої так не вистачає на просторах укрнету і який дав мені зрозуміти, що я не доріс ще до написання своїх опусів на DOU може піду спробую пописати на Medium, цікаво що на ХаброХабр

тільки всім пох

AT24C256 EEPROM (32KB, I2C):

Можна було просто ESP12 взяти, чи свіжий esp32с3 та використовувати для збереження flash. Ну і був би ще wifi на всякий, в другому випадку ще і BT.

у EEPROM набагато більше циклів перезапису

Це якщо вони треба. ЇЇ ж не обов’язково постійно оновлювати при кожній зміні стану, якщо це просто бекап. Пропало живлення на вході- записали бекап, хоча звісно зайві 15 центів в даному випадку не врятують, а місце не лімітоване.

Ха, ха, ха
Щоб детекити «зникнення живлення» потрібно робити окрему схему, зі швидкими мофсетами замість діодів і запасом конденсаторів.
Інакще ви не встигните нічого, максимум пам’ять «пожуе» на ESP.
Знаю, робив.

Дякую за коментар!

Вибір Raspberry Pi Pico (RP2040) для проєкту IoT PowerHub був свідомим і базувався на комплексі причин, які виходять за рамки лише вартості чи наявності Wi-Fi/BT:

Переваги RP2040:
Двоядерна Архітектура: Два ядра Cortex-M0+ забезпечили апаратний паралелізм. Це дозволило ізолювати критичну логіку (керування реле) від повільних і непередбачуваних GSM-операцій, гарантуючи миттєве виконання команд у промислових умовах.

Надійність (Persistence): Використання зовнішньої EEPROM (1 мільйон циклів запису) для збереження стану реле є на порядки надійнішим за вбудовану Flash-пам’ять, що критично для довговічності системи в разі збоїв живлення.

Екосистема та Хобі:

TinyML: RP2040 має відмінну підтримку TensorFlow Lite Micro (TFLite Micro) з оптимізацією під два ядра, що відкриває шлях до майбутніх проєктів машинного навчання.

Гнучкість Коду: Підтримка нативного C/C++ через чистий SDK та CMake, а також можливість писати на Python/MicroPython та через Arduino IDE.

Зручність Розробки: Це вибір хобіста (а не лише професійного Embedded-розробника). Я віддав перевагу відкритому та легкому інструментарію Pico, оскільки маю негативний досвід роботи з важкими та складними IDE, зокрема STM32CubeIDE, що значно ускладнювало мені освоєння STM32.

Готовність до Роботи: Pico, як частина екосистеми Raspberry Pi, дає мені готові інструменти для швидкого прототипування та налагодження, що мінімізує потребу у пайці та макетних платах на початкових етапах.

Враховуючи, що система працює через GSM, а не Wi-Fi, і потребує максимальної надійності збереження стану, Pi Pico став ідеальною, економічною та гнучкою платформою, що відповідає моєму досвіду та стилю розробки.
Ну не люблю я stm32 усе інше просто мабуть мої відмазки

Окрім того, давно хотів поекспериментувати з Cortex-M0+ і плату мабуть так і знайшов

цікаво, чому автор вирішив порівнювати саме ці варіанти мікроконтролерів для своєї задачі. останній, скоріше, — Arduino UNO R3, який ок як навчальний варіант.
Для IoT в того ж Arduino інші варіанти, як от Arduino Nano ESP32.

Дякую за цікаве зауваження! Це справді важливий момент, який вимагає уточнити контекст порівняння у статті.

Ви абсолютно праві: Arduino Uno R3 (на базі ATmega328) сьогодні не є актуальним вибором для комерційного IoT, і Arduino Nano ESP32 є набагато сучаснішим варіантом.

Однак, я включив Uno R3 до порівняння з дуже конкретних, особистих і технічних причин:

Контролер-Легенда (Особистий Досвід):

Я знайомий із чипом ATmega328 понад 10 років, ще з часів, коли освоював асемблер, прошивав кастомні бутлоадери і розробляв фінансово успішні проєкти.

Uno R3 — це контролер-класика, який довів свою надійність у складних умовах. Він є для мене еталоном мікроконтролерів, на якому я реалізував, наприклад, роботу з трьома UART одночасно (GSM, GPS, принтер), хоча фізично на чипі є лише один апаратний UART. Це демонструє, що можливості чипа часто більші, ніж його специфікація.

Аргумент Контрасту:

Я використав Uno R3 як «технічний якір» — приклад платформи, ресурси якої (2 KB RAM, 32 KB Flash) уже недостатні для сучасних завдань, як-от робота з важкими MQTT-бібліотеками та двоядерний паралелізм.

Це дозволило чітко показати, чому ми змушені переходити на 32-бітні чипи (Pi Pico/ESP32).

Порівняння Чипів, а не Брендів:

У статті порівнюються саме технологічні можливості мікроконтролерів (ATMega vs RP2040 vs ESP32), а не фірмові бренди плат.

Чому не STM32 і не ESP?
Мій вибір RP2040 (Pi Pico) був синергією всіх факторів:

Технології: Два ядра, підтримка TFLite Micro, низька ціна.

Екосистема: Можливість писати на C/C++, Python та Arduino IDE.

Комфорт: Я не є професійним Embedded-розробником; це хобі. Моя особиста нелюбов до STM32 (через негативний досвід з їхніми IDE) та любов до Raspberry Pi (починаючи з Zero) переважили. Pi Pico дає свободу і повний контроль над оточенням, чого мені бракувало в інших платформах. Тож зробив платку яка можливо стане платформою для інших цікавих проектів, оскільки модульно, gsm можна зняти і буде uart з конектором в який можна приєднати той же самий Arduino mini через додатковий шилд

Безпека важлива, але на MCU немає місця для AES.

А який AES ви пробували? бо я втягував AES & ECDSA (цифровий підпис).
Використовував mbedlts и це приблизно 40kB у флеші.

з QoS=2 (гарантована доставка)

tcp на свому рівні вже гарантує доставку, тобто необхідне додаткове обгрунтування для qos>0

Так у вашому випадку в чому саме (в якій частині по ланцюжку проходження) була необхідність з mqtt_qos>0?

Це моя перша стаття на DOU

Взагалі-то третя. Згадав що щось таке я вже бачив пару днів тому — подивився в ваш профіль, і дійсно..

Мала бути першою, але затрималась на модерації

У розділі авторських статей (техстатей/блогів) у нас є черга на публікацію, саме тому вони публікуються дещо довше, ніж топіки 🙌

Дякую за пояснення, наступного разу візьму до уваги

Але, якщо бути точним то це перша стаття, усе інше топіки

Я думаю буде дуже цікаво для початківців, особливо стосовно плат.

А SIM800 поганий вибір, особливо в такому форм-факторі
— у нього логічний рівень свій «особливий» і для довгострокового використання потрібно согласування (існують вже готові модулі)
— живлення також «альтернативне» (точніше заточене під літій) і в тих модулях що е роз’язка логіки, одразу і живлення нормально ставлять
— модуль вже дуже-дуже старий, е країни в яких вже відмовились від таких протоколів і частот. Що до України я теж про це чув шо хочуть, тобто якшо це реально промислове то краще ставити щось що зможе і в 3G хочаб (доречі проблеми зі з’язком можуть бути тому що не всі вишки біля вас пiдтримують застарілий 2G). Не ваш випадок, але SIM800 добре коли потрібне лише СМС та дзвінки

За пам’ять, рекомендую почитати що це взагалі за звір і як виглядае String на мікроконтроллерах. Зі String можна і потрібно працювати, але його треба вміти «готувати»

Взагалі для таких задач особливо с поганим інетом роблять на своєму бінарному протоколі, mqtt не підійде по багатьом причинам.

В цілому воно працює, ви отримали досвід, ще й статтю написали — чого ще потрібно то?)

і в 3G хочаб

от як раз 3G вже майже мертвий, 2G ще протягне якийсь час. Ну у автора хоча б SIM800 модулем, а не впаяний, то можна поміняти на LTE та переробити проект.

Дякую, що приділили увагу та виклали свою думку. Про память я знаю що воно таке і як готувати. Але в контексті корисності хотів, щоб на це звертали увагу. Схожа залізяка, з цим модулем SIM 800 катається на газовозах та стоїть на бочках з газом вже майже 10 років в дощ сніг і в мороз. Тож брав те що перевірено часом та можна буде через додатковий шильд поставити інші модулі. Може порадите шось краще то потестю перехідник. Бінарний протокол думав, може з часом зроблю, тут вся увага на платі бо в розводці плат перший досвід. І панель управління тре покращити.

для такого краше б взяли дешевий китайский трекер в автівку і просто перешили би під себе
тема знайома, там звичайний AVR і для задач де потрібно монтувати в автівку вирішуе багато питань, причому вільних GPIO та ADC пінів там вистачае.

для авто багато питань ше к зовнішньому середовищу та вібраціям

Дякую, за пораду, непогана ідея трекер глянути, тим більш маю арсенал програматорів. Якщо мова йде про газовози то там не трекер, а передавач даних з лічильника з самописною реалізацією ModbusRTU та відправкою друку чеків на принтері. Якщо стосовно цього проекту то думаю він знайде ще більше реалізацій у вигляді шильда для pi pici. Якщо вистачить ресурсу планую кастомний буталодер додати, щоб можна було збирати код під різні потреби, клікаючи чекбокси

так я и не кажу за трекер, я кажу за готове залізо яке коштуе копійки і втикается готовим модулем в автівку (е прям с готовими штекерами щоб на вільний CAN вішати)

А лічильник і чековий принтер можна також тоді на CAN повісити, щоб не потрібно було з монтажом проводів возитись, а просто в автомобільну мережу врізатись

за збірку — platformio
ini файл опише вам всі доступпні сбірки і збирати можна хоч по тегам

Плюсую за Pio. Я його до emacs прикрутив.

Трошки більше поясніть, чому за Pio і що таке emacs? Просто ну дуже цікаво

що не всі вишки біля вас пiдтримують застарілий 2G

Всі вони будуть підтримувати бо це базовий протокол для кучі девайсів для фолбеку коли 4G+ не добиває. 2G набагато економніший для обох сторін при значно більшій дальності.

В европі 2G вже давно не всюди і з кожним роком все більше країн йдуть по цьому шляху
Це я наживу по роботі бачу за останні 5 років, а не просто зі стелі взяв

В европі

А в Японії так взагалі :) То країни відносно з великою густотою населення, відповідними доходами з абонента та пристроями (не дзвонилки за 15$) і все одно у них залишають покриття спеціально для IoT, але не для абонентів. Для України відмова від 2G ще довго буде нерентабельною, в нас ще є території де і стабільного 2G досі немає.

Підписатись на коментарі