Да через ВПН.
Похоже нужно в другую тему перейти.
Да через ВПН.
Похоже нужно в другую тему перейти.
Попробовал залогиниться через Гугль - требует ввести номер телефона одной из “разрешенных стран”. В принципе, можно заморочится и поискать в сети одноразовую симку… но лень. Может когда-нить потом.
Я не так уж плохо пишу код вместе с Яндекс-ГПТ. Мне пока хватает
Update:
А вот ДипСик без проблем открывается через Гугл-аккаунт. Я там зарегился пару месяцев назад, пока не забанили ![]()
Не знаю, у меня просто через ВПН с моим обычным гугл-аккаунтом работает.
Да я как то сравнивал, + ещё 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);
}
фиг его знает, может я как-то не так начал регистрироваться - но он у меня телефон просит
Попробовал Qwen - так это вообще шпарит “без СМС и регистрации” прямо с российского IP
Интересно, а чтение датчика чем закончилось?
Оно не закончилось, оно ещё в процессе.