commit 3524b31c377e29a6aef04d9c2aad64a9cc368177 Author: zedefen Date: Sat Jan 24 17:38:18 2026 +0000 Загрузить файлы в «/» diff --git a/ADSL_wifi_tester.ino b/ADSL_wifi_tester.ino new file mode 100644 index 0000000..83682d0 --- /dev/null +++ b/ADSL_wifi_tester.ino @@ -0,0 +1,414 @@ +#include +#include +#define _LCD_TYPE 1 +#include +#include + +LCD_1602_RUS lcd(0x3F, 16, 2); + +const char* ssid = "TP-LINK_904E"; +const char* password = "30923805"; +const char* server = "192.168.1.1"; // IP роутера +const int port = 23; // Порт Telnet +const char* telnetUser = "admin"; +const char* telnetPass = "admin"; +const char* cmdadsl = "adsl info --show"; + +WiFiClient client; + +String readResponse() { + String response = ""; + unsigned long startTime = millis(); + + while (millis() - startTime < 2000) { // Читаем 2 секунды + if (client.available()) { + char c = client.read(); + response += c; + } + } + return response; +} + +void sendCommand(String command) { + if (client.connected()) { + client.print(command); + client.print("\r\n"); + Serial.println("Команда отправлена: " + command); + + // Ждем и читаем ответ + delay(1000); + String response = readResponse(); + Serial.println("Ответ:"); + Serial.println(response); + } else { + Serial.println("Нет подключения к роутеру!"); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Не удаётся"); + lcd.setCursor(0,1); + lcd.print("подкл. к telnet"); + } +} + +String extractMode(String response) { + // Ищем позицию начала Mode данных + int ModeIndex = response.indexOf("Mode:"); + if (ModeIndex == -1) { + Serial.println("Mode data not found"); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Нет данных"); + lcd.setCursor(0,1); + lcd.print("о режиме передачи"); + return "null"; + } + + int dataStart = ModeIndex + 5; // 5 символов в "Mode:" + + // Извлекаем подстроку с данными + String dataLine = response.substring(dataStart); + int endOfLine = dataLine.indexOf("\n"); + if (endOfLine != -1) { + dataLine = dataLine.substring(0, endOfLine); + } + dataLine.trim(); // Убираем пробелы в начале и конце + Serial.print("Mode: "); + Serial.println(dataLine); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Стандарт ADSL:"); + lcd.setCursor(0,1); + lcd.print(dataLine); + return dataLine; + +} + +void extractSpeed(String response) { + // Ищем позицию начала Speed данных + int SpeedIndex = response.indexOf("Max:"); + if (SpeedIndex == -1) { + Serial.println("Speed data not found"); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Нет данных"); + lcd.setCursor(0,1); + lcd.print("о скорости"); + return; + } + + int dataStart = SpeedIndex + 4; // 4 символа в "Max:" + + // Извлекаем подстроку с данными + String dataLine = response.substring(dataStart); + + // Ищем конец строки (до следующей метки или конца) + int endOfLine = dataLine.indexOf("\n"); + if (endOfLine != -1) { + dataLine = dataLine.substring(0, endOfLine); + } + + // Теперь у нас строка типа: " Upstream rate = 1307 Kbps, Downstream rate = 27992 Kbps" + // Разделяем ее на два значения + dataLine.trim(); // Убираем пробелы в начале и конце + + String Upstream = dataLine; + Upstream=Upstream.substring(16,dataLine.indexOf(", ")); + + String Downstream = dataLine; + Downstream=Downstream.substring(dataLine.indexOf(", ")+20,dataLine.indexOf("\n")); + + Serial.print("Speed Down: "); + Serial.println(Downstream); + Serial.print("Speed Up: "); + Serial.println(Upstream); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Ск. И " + String(Upstream)); + lcd.setCursor(0,1); + lcd.print("Ск. В " + String(Downstream)); +} + +void extractSNR(String response) { + // Ищем позицию начала SNR данных + int snrIndex = response.indexOf("SNR (dB):"); + if (snrIndex == -1) { + Serial.println("SNR data not found"); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Нет данных"); + lcd.setCursor(0,1); + lcd.print("об уровне шума"); + return; + } + + int dataStart = snrIndex + 9; // 9 символов в "SNR (dB):" + + // Извлекаем подстроку с данными + String dataLine = response.substring(dataStart); + + // Ищем конец строки (до следующей метки или конца) + int endOfLine = dataLine.indexOf("\n"); + if (endOfLine != -1) { + dataLine = dataLine.substring(0, endOfLine); + } + + // Теперь у нас строка типа: " 20.5 27.3" + // Разделяем ее на два значения + dataLine.trim(); // Убираем пробелы в начале и конце + + // Первое число закончится, когда начнутся пробелы перед вторым числом + int spaceBetween = dataLine.indexOf(" "); + if (spaceBetween == -1) { + // Если нет двойного пробела, ищем одинарный + spaceBetween = dataLine.indexOf(' ', dataLine.indexOf(' ') + 1); + } + + if (spaceBetween != -1) { + String snrDown = dataLine.substring(0, spaceBetween); + String snrUp = dataLine.substring(spaceBetween); + snrUp.trim(); + + float downSNR = snrDown.toFloat(); + float upSNR = snrUp.toFloat(); + + Serial.print("SNR Down: "); + Serial.println(downSNR); + Serial.print("SNR Up: "); + Serial.println(upSNR); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Шум. И " + String(upSNR) + "dB"); + lcd.setCursor(0,1); + lcd.print("Шум. В " + String(downSNR) + "dB"); + } +} + +void extractAttn(String response) { + // Ищем позицию начала Attn данных + int AttnIndex = response.indexOf("Attn(dB):"); + if (AttnIndex == -1) { + Serial.println("Attn data not found"); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Нет данных"); + lcd.setCursor(0,1); + lcd.print("о затухании"); + return; + } + + int dataStart = AttnIndex + 9; // 9 символов в "Attn(dB):" + + // Извлекаем подстроку с данными + String dataLine = response.substring(dataStart); + + // Ищем конец строки (до следующей метки или конца) + int endOfLine = dataLine.indexOf("\n"); + if (endOfLine != -1) { + dataLine = dataLine.substring(0, endOfLine); + } + // Теперь у нас строка типа: " 0.0 0.8" + // Разделяем ее на два значения + dataLine.trim(); // Убираем пробелы в начале и конце + + // Первое число закончится, когда начнутся пробелы перед вторым числом + int spaceBetween = dataLine.indexOf(" "); + if (spaceBetween == -1) { + // Если нет двойного пробела, ищем одинарный + spaceBetween = dataLine.indexOf(' ', dataLine.indexOf(' ') + 1); + } + + if (spaceBetween != -1) { + String AttnDown = dataLine.substring(0, spaceBetween); + String AttnUp = dataLine.substring(spaceBetween); + AttnUp.trim(); + + float downAttn = AttnDown.toFloat(); + float upAttn = AttnUp.toFloat(); + + Serial.print("Attn Down: "); + Serial.println(downAttn); + Serial.print("Attn Up: "); + Serial.println(upAttn); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Зат. И " + String(upAttn) + "dB"); + lcd.setCursor(0,1); + lcd.print("Зат. В " + String(downAttn) + "dB"); + } +} + +void extractPwr(String response) { + // Ищем позицию начала Pwr данных + int PwrIndex = response.indexOf("Pwr(dBm):"); + if (PwrIndex == -1) { + Serial.println("Pwr data not found"); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Нет данных"); + lcd.setCursor(0,1); + lcd.print("о мощности"); + return; + } + + int dataStart = PwrIndex + 9; // 9 символов в "Pwr (dBm):" + + // Извлекаем подстроку с данными + String dataLine = response.substring(dataStart); + + // Ищем конец строки (до следующей метки или конца) + int endOfLine = dataLine.indexOf("\n"); + if (endOfLine != -1) { + dataLine = dataLine.substring(0, endOfLine); + } + + // Теперь у нас строка типа: " 7.5 9.3" + // Разделяем ее на два значения + dataLine.trim(); // Убираем пробелы в начале и конце + + // Первое число закончится, когда начнутся пробелы перед вторым числом + int spaceBetween = dataLine.indexOf(" "); + if (spaceBetween == -1) { + // Если нет двойного пробела, ищем одинарный + spaceBetween = dataLine.indexOf(' ', dataLine.indexOf(' ') + 1); + } + + if (spaceBetween != -1) { + String PwrDown = dataLine.substring(0, spaceBetween); + String PwrUp = dataLine.substring(spaceBetween); + PwrUp.trim(); + + + float downPwr = PwrDown.toFloat(); + float upPwr = PwrUp.toFloat(); + + Serial.print("Pwr Down: "); + Serial.println(downPwr); + Serial.print("Pwr Up: "); + Serial.println(upPwr); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Мощн. И " + String(upPwr) + "dBm"); + lcd.setCursor(0,1); + lcd.print("Мощн. В " + String(downPwr) + "dBm"); + } +} + +float mapf(float value, float fromLow, float fromHigh, float toLow, float toHigh) + { + float result; + result = (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow; + return result; + } + +void setup() { + pinMode(A0, INPUT); + int percentv = ((mapf(analogRead(A0),0,1024,0,4.2) - 3.3) / (4.2 - 3.3)) * 100.0; + if(percentv<0)percentv=0; + if(percentv>100)percentv=100; + + lcd.init(); + lcd.backlight(); + Serial.begin(115200); + WiFi.begin(ssid, password); + + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Инициализация"); + lcd.setCursor(0,1); + lcd.print("тестера"); + delay(1000); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Заряд батареи"); + lcd.setCursor(0,1); + lcd.print(String(percentv) + "%"); + delay(2000); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Инициализация"); + + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + lcd.setCursor(0,1); + lcd.print("WiFi"); + } + + Serial.println("\nПодключено к WiFi"); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Подключен к WiFi"); + + delay(1000); + + if (client.connect(server, port)) { + Serial.println("Подключен к Telnet-серверу"); + lcd.setCursor(0,1); + lcd.print("Подкл. к Telnet"); + } else { + Serial.println("Ошибка подключения"); + lcd.setCursor(0,1); + lcd.print("Ошибка подключ."); + } + if (client.connected()) { + // Читаем приветственное сообщение + String response = readResponse(); + Serial.println("Ответ от роутера:"); + Serial.println(response); + + // Отправляем логин + client.print(telnetUser); + client.print("\r\n"); + Serial.println("Отправлен логин: " + String(telnetUser)); + delay(1000); + + // Читаем ответ и отправляем пароль + response = readResponse(); + Serial.println("Ответ от роутера:"); + Serial.println(response); + + client.print(telnetPass); + client.print("\r\n"); + Serial.println("Отправлен пароль: " + String(telnetPass)); + delay(1000); + + // Читаем финальный ответ + response = readResponse(); + Serial.println("Ответ от роутера:"); + Serial.println(response); + lcd.clear(); + lcd.setCursor(0,0); + lcd.print("Подкл. " + String(ssid)); + lcd.setCursor(0,1); + lcd.print("Прием данных"); + + } + delay(1000); + +} + +void loop() { + delay(1000); + if (client.connected()) { + client.print(cmdadsl); + client.print("\r\n"); + Serial.println("Отправил: " + String(cmdadsl)); + delay(1000); + + String response = readResponse(); +// Serial.println("Ответ от роутера:"); +// Serial.println(response); + + extractMode(response); + delay(4000); + extractSpeed(response); + delay(4000); + extractSNR(response); + delay(4000); + extractAttn(response); + delay(4000); + extractPwr(response); + delay(4000); + } +} \ No newline at end of file