Чтение данных с датчика MIS-3600-006DI

Да через ВПН.

Похоже нужно в другую тему перейти.

Попробовал залогиниться через Гугль - требует ввести номер телефона одной из “разрешенных стран”. В принципе, можно заморочится и поискать в сети одноразовую симку… но лень. Может когда-нить потом.
Я не так уж плохо пишу код вместе с Яндекс-ГПТ. Мне пока хватает

Update:
А вот ДипСик без проблем открывается через Гугл-аккаунт. Я там зарегился пару месяцев назад, пока не забанили :slight_smile:

1 лайк

Не знаю, у меня просто через ВПН с моим обычным гугл-аккаунтом работает.

Да я как то сравнивал, + ещё qwen и kimi.

Пока реально Клод полноценнее пишет. И подробно объясняет по ходу что к чему и зачем.

Для примера из соседней ветки про контроль насоса. Промт - первое сообщение + “напиши код Ардуино для esp”. Выдал вот такую “простыню”. При этом сам приплёл телеграм оповещения и датчик подобрал ACS712

Спойлер
/*
 * Контроль дренажного насоса - ESP8266 (ESP-01)
 * С уведомлениями через Telegram
 */

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// === НАСТРОЙКИ WiFi ===
const char* WIFI_SSID = "ВАШ_WIFI";
const char* WIFI_PASSWORD = "ВАШ_ПАРОЛЬ";

// === НАСТРОЙКИ Telegram ===
#define BOT_TOKEN "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
#define CHAT_ID "ВАШИХ_CHAT_ID"  // Узнать у @userinfobot

// === НАСТРОЙКИ ПИНОВ (ESP-01) ===
const int CURRENT_SENSOR_PIN = A0;      // Аналоговый вход (единственный)
const int LED_PIN = 2;                  // GPIO2 - встроенный LED

// === НАСТРОЙКИ КОНТРОЛЯ ===
const float CURRENT_THRESHOLD = 0.15;   // Порог тока (А) - меньше из-за делителя
const unsigned long MAX_RUN_TIME = 5UL * 60UL * 1000UL;        // 5 минут
const unsigned long MAX_IDLE_TIME = 10UL * 60UL * 60UL * 1000UL; // 10 часов

// Для тестирования используйте меньшие значения:
// const unsigned long MAX_RUN_TIME = 30000;      // 30 секунд
// const unsigned long MAX_IDLE_TIME = 120000;    // 2 минуты

// === ПЕРЕМЕННЫЕ ===
bool pumpRunning = false;
bool pumpRunningPrev = false;
unsigned long pumpStartTime = 0;
unsigned long pumpStopTime = 0;
bool alarmActive = false;
bool alarmSent = false;

WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);

unsigned long lastTelegramCheck = 0;
const unsigned long TELEGRAM_CHECK_INTERVAL = 2000;  // Проверка команд каждые 2 сек

// Калибровка для ESP8266 с делителем
const float ADC_VOLTAGE_REF = 1.0;       // ESP8266 ADC: 0-1V
const float VOLTAGE_DIVIDER = 2.0;       // Делитель 1:1 (10k:10k)
const float ACS712_SENSITIVITY = 0.100;  // 100mV/A для 20A версии
const float ACS712_ZERO_CURRENT = 0.5;   // После делителя: 2.5V / 2 = 1.25V

// === ФУНКЦИИ ===

// Чтение тока с датчика
float readCurrent() {
  int rawValue = 0;
  
  // Усреднение 20 измерений
  for(int i = 0; i < 20; i++) {
    rawValue += analogRead(CURRENT_SENSOR_PIN);
    delay(5);
  }
  rawValue /= 20;
  
  // ESP8266 ADC: 0-1023 соответствует 0-1V
  float voltage = (rawValue / 1024.0) * ADC_VOLTAGE_REF;
  
  // Учитываем делитель напряжения
  voltage *= VOLTAGE_DIVIDER;
  
  // Преобразование в ток
  float current = abs((voltage - (ACS712_ZERO_CURRENT * VOLTAGE_DIVIDER)) / ACS712_SENSITIVITY);
  
  return current;
}

// Отправка сообщения в Telegram
void sendTelegram(String message) {
  Serial.println("Отправка в Telegram: " + message);
  
  if(bot.sendMessage(CHAT_ID, message, "")) {
    Serial.println("✓ Сообщение отправлено");
  } else {
    Serial.println("✗ Ошибка отправки");
  }
}

// Активация тревоги
void activateAlarm(String message) {
  alarmActive = true;
  Serial.println("!!! ТРЕВОГА: " + message);
  
  // Отправить уведомление только один раз
  if(!alarmSent) {
    String fullMessage = "🚨 ТРЕВОГА!\n\n" + message;
    fullMessage += "\n\nВремя: " + getTimeString(millis());
    sendTelegram(fullMessage);
    alarmSent = true;
  }
  
  // Мигание LED
  digitalWrite(LED_PIN, LOW);  // LOW = включить (инверсная логика)
}

// Деактивация тревоги
void deactivateAlarm() {
  if(alarmActive) {
    alarmActive = false;
    alarmSent = false;
    digitalWrite(LED_PIN, HIGH);  // HIGH = выключить
    Serial.println("Тревога отключена");
  }
}

// Форматирование времени
String getTimeString(unsigned long milliseconds) {
  unsigned long seconds = milliseconds / 1000;
  unsigned long minutes = seconds / 60;
  unsigned long hours = minutes / 60;
  
  String result = "";
  
  if(hours > 0) {
    result += String(hours) + "ч ";
    result += String(minutes % 60) + "м";
  } else if(minutes > 0) {
    result += String(minutes) + "м ";
    result += String(seconds % 60) + "с";
  } else {
    result += String(seconds) + "с";
  }
  
  return result;
}

// Обработка команд Telegram
void handleTelegramMessages(int numNewMessages) {
  for(int i = 0; i < numNewMessages; i++) {
    String chat_id = String(bot.messages[i].chat_id);
    String text = bot.messages[i].text;
    String from_name = bot.messages[i].from_name;
    
    Serial.println("Команда от " + from_name + ": " + text);
    
    if(text == "/start") {
      String welcome = "🔧 Контроль дренажного насоса\n\n";
      welcome += "Команды:\n";
      welcome += "/status - Текущий статус\n";
      welcome += "/reset - Сбросить тревогу\n";
      welcome += "/info - Параметры системы";
      bot.sendMessage(chat_id, welcome, "");
    }
    
    else if(text == "/status") {
      String status = getStatusMessage();
      bot.sendMessage(chat_id, status, "");
    }
    
    else if(text == "/reset") {
      deactivateAlarm();
      bot.sendMessage(chat_id, "✓ Тревога сброшена", "");
    }
    
    else if(text == "/info") {
      String info = "⚙️ Параметры:\n\n";
      info += "Макс. работа: " + getTimeString(MAX_RUN_TIME) + "\n";
      info += "Макс. простой: " + getTimeString(MAX_IDLE_TIME) + "\n";
      info += "Порог тока: " + String(CURRENT_THRESHOLD) + " A\n";
      info += "\nWiFi: " + String(WIFI_SSID) + "\n";
      info += "IP: " + WiFi.localIP().toString();
      bot.sendMessage(chat_id, info, "");
    }
  }
}

// Получить сообщение о статусе
String getStatusMessage() {
  float current = readCurrent();
  unsigned long currentTime = millis();
  
  String status = "📊 Статус насоса\n\n";
  
  if(pumpRunning) {
    unsigned long runDuration = currentTime - pumpStartTime;
    status += "🟢 Насос РАБОТАЕТ\n";
    status += "Время работы: " + getTimeString(runDuration) + "\n";
    status += "Ток: " + String(current, 2) + " A\n";
    
    if(alarmActive) {
      status += "\n🚨 ТРЕВОГА: Превышено время работы!";
    }
  } else {
    unsigned long idleDuration = currentTime - pumpStopTime;
    status += "⚪ Насос НЕ РАБОТАЕТ\n";
    status += "Простой: " + getTimeString(idleDuration) + "\n";
    status += "Ток: " + String(current, 2) + " A\n";
    
    if(alarmActive) {
      status += "\n🚨 ТРЕВОГА: Долгий простой!";
    }
  }
  
  status += "\n\nUptime: " + getTimeString(currentTime);
  
  return status;
}

// === SETUP ===
void setup() {
  Serial.begin(115200);
  Serial.println("\n\n=== ESP8266 Контроль насоса ===");
  
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);  // Выключить LED
  
  // Подключение к WiFi
  Serial.print("Подключение к WiFi");
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  
  int attempts = 0;
  while(WiFi.status() != WL_CONNECTED && attempts < 30) {
    delay(500);
    Serial.print(".");
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));  // Мигание
    attempts++;
  }
  
  if(WiFi.status() == WL_CONNECTED) {
    Serial.println("\n✓ WiFi подключен!");
    Serial.println("IP: " + WiFi.localIP().toString());
    digitalWrite(LED_PIN, HIGH);
    
    // Настройка SSL для Telegram
    secured_client.setInsecure();  // Для простоты, без проверки сертификата
    
    // Отправить стартовое сообщение
    String startMsg = "✅ Система контроля насоса запущена\n\n";
    startMsg += "IP: " + WiFi.localIP().toString() + "\n";
    startMsg += "Используйте /status для проверки";
    sendTelegram(startMsg);
    
  } else {
    Serial.println("\n✗ Ошибка подключения к WiFi!");
    // Продолжаем работу без WiFi
  }
  
  // Инициализация
  pumpStopTime = millis();
  
  Serial.println("=== Система запущена ===");
  Serial.print("Порог тока: ");
  Serial.print(CURRENT_THRESHOLD);
  Serial.println(" A");
  
  // Тестовое мигание
  for(int i = 0; i < 3; i++) {
    digitalWrite(LED_PIN, LOW);
    delay(100);
    digitalWrite(LED_PIN, HIGH);
    delay(100);
  }
}

// === LOOP ===
void loop() {
  // Проверка WiFi
  if(WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi отключен, переподключение...");
    WiFi.reconnect();
    delay(5000);
    return;
  }
  
  // Проверка команд Telegram
  if(millis() - lastTelegramCheck > TELEGRAM_CHECK_INTERVAL) {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    if(numNewMessages > 0) {
      handleTelegramMessages(numNewMessages);
    }
    lastTelegramCheck = millis();
  }
  
  // Чтение тока
  float current = readCurrent();
  
  // Определение состояния насоса
  pumpRunning = (current > CURRENT_THRESHOLD);
  
  unsigned long currentTime = millis();
  
  // === ОПРЕДЕЛЕНИЕ СОБЫТИЙ ===
  
  // Насос включился
  if(pumpRunning && !pumpRunningPrev) {
    pumpStartTime = currentTime;
    String msg = "▶️ Насос ВКЛЮЧИЛСЯ\nТок: " + String(current, 2) + " A";
    Serial.println(msg);
    sendTelegram(msg);
    
    if(alarmActive) {
      deactivateAlarm();
    }
  }
  
  // Насос выключился
  if(!pumpRunning && pumpRunningPrev) {
    pumpStopTime = currentTime;
    unsigned long runDuration = currentTime - pumpStartTime;
    
    String msg = "⏹️ Насос ВЫКЛЮЧИЛСЯ\nВремя работы: " + getTimeString(runDuration);
    Serial.println(msg);
    sendTelegram(msg);
    
    if(alarmActive) {
      deactivateAlarm();
    }
  }
  
  // === ПРОВЕРКА УСЛОВИЙ ТРЕВОГИ ===
  
  // Тревога: долгая работа
  if(pumpRunning) {
    unsigned long runDuration = currentTime - pumpStartTime;
    
    if(runDuration > MAX_RUN_TIME && !alarmActive) {
      String msg = "Насос работает слишком долго!\n";
      msg += "Время: " + getTimeString(runDuration);
      activateAlarm(msg);
    }
    
    // Статус каждые 30 секунд
    if(runDuration % 30000 < 1000) {
      Serial.print("Работает: ");
      Serial.print(getTimeString(runDuration));
      Serial.print(" | Ток: ");
      Serial.println(current);
    }
  }
  
  // Тревога: долгий простой
  if(!pumpRunning) {
    unsigned long idleDuration = currentTime - pumpStopTime;
    
    if(idleDuration > MAX_IDLE_TIME && !alarmActive) {
      String msg = "Насос не включается слишком долго!\n";
      msg += "Простой: " + getTimeString(idleDuration);
      activateAlarm(msg);
    }
  }
  
  // Мигание LED при тревоге
  if(alarmActive) {
    digitalWrite(LED_PIN, (millis() / 500) % 2 ? HIGH : LOW);
  }
  
  pumpRunningPrev = pumpRunning;
  
  delay(1000);
}

1 лайк

фиг его знает, может я как-то не так начал регистрироваться - но он у меня телефон просит

Попробовал Qwen - так это вообще шпарит “без СМС и регистрации” прямо с российского IP

Интересно, а чтение датчика чем закончилось?

Оно не закончилось, оно ещё в процессе.