All streams
Search
Write a publication
Pull to refresh
9
0
Send message

Вы к кому сейчас обращались? Я лишь тактично попытался намекнуть автору статьи, что асинхронный код лучше синхронного. И на брудершафт мы вроде не пили пока чтобы тыкать.

Мне кажется у DeepSeek лучше получилось. =)

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

/* Network Configuration */
const char* ssid = "ESP32";
const char* password = "12345678";
IPAddress local_ip(192,168,1,1);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

/* LED Pins */
const uint8_t LED1pin = 4;
const uint8_t LED2pin = 5;
bool LED1status = false;
bool LED2status = false;

AsyncWebServer server(80);

String generateHTML(bool led1, bool led2) {
  String html = R"rawliteral(
<!DOCTYPE html><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>LED Control</title>
  <style>
    html {font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
    body {margin-top: 50px;} 
    h1 {color: #444444; margin: 50px auto 30px;} 
    h3 {color: #444444; margin-bottom: 50px;}
    .button {
      display: block; width: 80px; background-color: #3498db; border: none;
      color: white; padding: 13px 30px; text-decoration: none; font-size: 25px;
      margin: 0px auto 35px; cursor: pointer; border-radius: 4px;
    }
    .button-on {background-color: #3498db;}
    .button-on:active {background-color: #2980b9;}
    .button-off {background-color: #34495e;}
    .button-off:active {background-color: #2c3e50;}
    p {font-size: 14px; color: #888; margin-bottom: 10px;}
  </style>
</head>
<body>
  <h1>ESP32 Web Server</h1>
  <h3>Using Access Point (AP) Mode</h3>
)rawliteral";

  html += (led1) ? 
    "<p>LED1 Status: ON</p><a class=\"button button-off\" href=\"/led1off\">OFF</a>\n" : 
    "<p>LED1 Status: OFF</p><a class=\"button button-on\" href=\"/led1on\">ON</a>\n";

  html += (led2) ? 
    "<p>LED2 Status: ON</p><a class=\"button button-off\" href=\"/led2off\">OFF</a>\n" : 
    "<p>LED2 Status: OFF</p><a class=\"button button-on\" href=\"/led2on\">ON</a>\n";

  html += "</body></html>";
  return html;
}

void setup() {
  Serial.begin(115200);
  pinMode(LED1pin, OUTPUT);
  pinMode(LED2pin, OUTPUT);
  digitalWrite(LED1pin, LOW);
  digitalWrite(LED2pin, LOW);

  // Configure WiFi AP
  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  Serial.print("AP IP address: ");
  Serial.println(WiFi.softAPIP());

  // Route handlers
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    LED1status = false;
    LED2status = false;
    Serial.println("GPIO4 Status: OFF | GPIO5 Status: OFF");
    request->send(200, "text/html", generateHTML(LED1status, LED2status));
  });

  server.on("/led1on", HTTP_GET, [](AsyncWebServerRequest *request){
    LED1status = true;
    Serial.println("GPIO4 Status: ON");
    request->send(200, "text/html", generateHTML(true, LED2status));
  });

  server.on("/led1off", HTTP_GET, [](AsyncWebServerRequest *request){
    LED1status = false;
    Serial.println("GPIO4 Status: OFF");
    request->send(200, "text/html", generateHTML(false, LED2status));
  });

  server.on("/led2on", HTTP_GET, [](AsyncWebServerRequest *request){
    LED2status = true;
    Serial.println("GPIO5 Status: ON");
    request->send(200, "text/html", generateHTML(LED1status, true));
  });

  server.on("/led2off", HTTP_GET, [](AsyncWebServerRequest *request){
    LED2status = false;
    Serial.println("GPIO5 Status: OFF");
    request->send(200, "text/html", generateHTML(LED1status, false));
  });

  server.onNotFound([](AsyncWebServerRequest *request){
    request->send(404, "text/plain", "Not found");
  });

  server.begin();
  Serial.println("HTTP async server started");
}

void loop() {
  // Update LED states
  digitalWrite(LED1pin, LED1status ? HIGH : LOW);
  digitalWrite(LED2pin, LED2status ? HIGH : LOW);
  
  // No need for server.handleClient() with async server
}

Интересный девайс, однако все что не вешается на стенку сразу уволить, да и к сетевым железкам сяоми я отношусь предвзято в плане их долговечности.

А есть ли смысл в современных реалиях ставить именно bind9?

КМК если только для общего развития.

Есть например:

которые в докере можно развернуть за пару минут.

Сомнений вообще не было никаких. =)

Мои задачи на bare metal серверах работают.

Допускаю, что для ряда сценариев заморозка уместна и ваша статья будет чрезвычайно полезна!

Срок заморозки ограничен как минимум балансом на аккаунте, про графические карты я имел ввиду что за нее платить придется вне зависимости от того заморожена она или нет. Место на диске (тома) тоже копейки? Такое впечатление, что вы комментарии по диагонали читаете.

За графическую карту у подавляющего большинства контор придется платить в любом случае. А еще за тома и за IP адреса. В большинстве случаев "заморозка" экономит сущие копейки, а вот головняка добавляет изрядно.

Не совсем понятна роль как OpenWRT, так и RPI во всей этой затее, если порт на VLAN не стали нарезать.

Если нужен роутер, то в разы дешевле все это на Билайн Smartbox pro, к примеру, развернуть, перешив его на OpenWRT.

А если стоит задача просто трафик заворачивать, то КМК все это можно прямо внутри телефона поднять. Не проверял эту тему пока за ненадобностью.

=)

КМК для кодинга с использованием ИИ обычные промпты недостаточно эффективны, надо создать некий метаязык и уже его скармливать специально заточенным под это моделям. Сами сетки очень недурственны в генерации кода, главная проблема состоит в том, чтобы дать им понять что ты от них КОНКРЕТНО хочешь. =)

Жуть как страшно, во первых Телеграм отправляет то что может с натяжкой классифицироваться как ПД только при использовании WebAPP или Telegram login.

О чем он честно предупреждает пользователя и РКН в этом случае идет лесом никуда не сворачивая.

А если при этом данные WebAPP отправляются на сайт никоим образом не аффилированный с РФ и/или юрилицом, то вообще разговаривать не о чем.

Статья высосана из пальца и отдает банальным хайпожорством.

=)

Телевизор UHD 43 дюйма в качестве основного и слева монитор QHD 32 дюйма.

Левый обычно включается только когда надо параллельно кино посмотреть или RDP сеанс запустить особо большого размера.

Много лет уже такая схема, доволен как слон.

=)

Мне тоже понравилось, а если использовать тома BTRFS или ZFS совместно с этой штукой, то вообще сказка. И снэпшоты и сжатие и шифрование (на ZFS) "из коробки". =)

Для тех кому лень заморачиваться с полноценным гипервизором давно придуман

https://github.com/dockur/windows

=)

Клапаны гальванически развязаны от воды. Про 12В соглашусь.

Электромагнитный клапан ставится не вместо шарового крана, а в качестве дополнения. Кроме того перед ним не лишним будет фильтр-сетку установить. По всей видимости НЕ ВСЕ фирмы по защите от протечек предлагают столь комплексные решения на бытовом уровне. =)

Не проблема найти клапаны под 12В, а с учетом того что 99% труб сейчас электричество не проводят, вероятность "выстрела в ногу" исчезающе мала.

Ну и никто не мешает ДОПОЛНИТЕЛЬНО приколхозить к этому клапану нечто вроде https://aliexpress.ru/item/1005003591184976.html и получить все блага цивилизации без необходимости инвестировать в дорогостоящие решения с сомнительной надежностью.

Детский сад на батарейках. =)

Ставится НЗ электромагнитный клапан, а в разрыв цепи питания датчик(и) протечки.

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

Даже mad 68 he стоит 75 евро, за $135 эта клава должна быть IP68 как минимум в придачу. =)

В Brave он встроен прямо в браузер, если кто на лису не хочет переезжать.

Настоящий высший пилотаж это https://github.com/simon-jouet/ESP32Controller

Жалко что не взлетело. =)

Information

Rating
Does not participate
Registered
Activity