Wemos d1 mini 的代码,可将西里尔字母转换为摩尔斯电码

问题描述 投票:0回答:1
#include <ESP8266WebServer.h>
const char *ssid = "YourSSID";         // SSID точки доступа
const char *password = "YourPassword"; // Пароль для точки доступа
ESP8266WebServer server(80);
const int ledPin = D4; // Пин, к которому подключен светодиод
const char *morseAlphabet[] = {
  ".-",    // А
  "-...",  // Б
  ".--",   // В
  "--.",   // Г
  "-..",   // Д
  ".",     // Е
  "..-.",  // Ж
  "--..",  // З
  "..",    // И
  ".---",  // Й
  "-.-",   // К
  ".-..",  // Л
  "--",    // М
  "-.",    // Н
  "---",   // О
  ".--.",  // П
  "--.-",  // Р
  "...",   // С
  "-",     // Т
  "..-",   // У
  "...-",  // Ф
  "....",  // Х
  "-.-.",  // Ц
  "---.",  // Ч
  "----",  // Ш
  "--.-",  // Щ
  "-..-",  // Ъ
  "-.--",  // Ы
  "-.--.", // Ь
  "..-..", // Э
  ".-.-",  // Ю
  "--.--"  // Я
};
void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(115200);
  // Подключение к Wi-Fi
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.on("/", HTTP_GET, handleRoot);
  server.on("/", HTTP_POST, handlePost);
  server.begin();
}
void loop() {
  server.handleClient();
}
void handleRoot() {
  String html = "<html><body>";
  html += "<h1>Преобразование текста в азбуку Морзе</h1>";
  html += "<form method='post' action='/'>";
  html += "Текст на русском языке: <input type='text' name='inputText'>";
  html += "<input type='submit' value='Отправить'>";
  html += "</form>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}
void handlePost() {
  String inputText = server.arg("inputText");
  String morseText = textToMorse(inputText);
  server.send(200, "text/html", "Текст на азбуке Морзе: " + morseText);
  flashMorseCode(morseText);
}
String textToMorse(String text) {
  String morseCode = "";
  text.toLowerCase();
  for (int i = 0; i < text.length(); i++) {
    char currentChar = text[i];
    if (currentChar == ' ') {
      morseCode += " ";
    } else if (isAlpha(currentChar)) {
      int index = currentChar - 'a';
      morseCode += morseAlphabet[index];
      morseCode += " ";
    }
  }
  return morseCode;
}
void flashMorseCode(String morse) {
  for (int i = 0; i < morse.length(); i++) {
    char symbol = morse[i];
    if (symbol == '.') {
      digitalWrite(ledPin, HIGH);
      delay(100); // Длительность точки
      digitalWrite(ledPin, LOW);
      delay(100); // Пауза между символами
    } else if (symbol == '-') {
      digitalWrite(ledPin, HIGH);
      delay(300); // Длительность тире
      digitalWrite(ledPin, LOW);
      delay(100); // Пауза между символами
    } else if (symbol == ' ') {
      delay(300); // Пауза между словами
    }
  }
}

我正在尝试为 Wemos d1 mini 编写一个代码来执行此操作。 wemos 创建一个热点和一个本地站点。其上将有一个用于文本输入的字段和一个发送按钮。当我输入文本并单击按钮时,它应该转换为莫尔斯电码(用于西里尔字母)。然后这个摩尔斯电码文本通过闪烁的 LED 输出。但并非一切都不是那么顺利,英文字母,但西里尔字母则不然。有人可以调整一下吗,我对此的权威已经结束了

说实话,我不太明白 为什么它不转换西里尔字母。我已经尝试了我能想到的一切

c++ arduino esp32 esp8266
1个回答
0
投票

您遇到的问题很可能是因为西里尔字符在 ASCII 之外,这意味着它们需要 2 个字节来编码每个字符,我不确定 arduino String 如何处理它(如果有的话)以及 html 页面实际发送的内容。

您可以测试逐一发送字符并获取其字节值,然后使用它来映射莫尔斯电码。

另一方面,我不会费心在 ESP 端做这件事,而是让 Javascript 在你的网页中处理它。

这是一个快速而肮脏的示例,当您在页面中提交文本时,会将其转换为莫尔斯电码并将准备好的莫尔斯电码作为字符串发送到您的 ESP 服务器。 它基本上完全取代了你的“textToMorse()”

void handlePost(){
  String morseText = server.arg("inputText"); //no need to textToMorse()

尝试用这个替换你的html,看看它是否有效,你可能需要做一些调整,我发现我必须在html头中包含meta charset =“utf-8”才能使其工作工作。

另请注意,我使用的是 id='inputText' 而不是 name='inputText'

<!DOCTYPE HTML>
<html>
   <head>
    <meta charset='utf-8'/>
   </head>
   <script>
    function textToMorse(form){
        let morseMap = {'а':'.-','б':'-...','в':'.--','г':'--.','д':'-..','е':'.','ж':'..-.','з':'--..','и':'..','й':'.---','к':'-.-','л':'.-..','м':'--','н':'-.','о':'---','п':'.--.','р':'--.-','с':'...','т':'-','у':'..-','ф':'...-','х':'....','ц':'-.-.','ч':'---.','ш':'----','щ':'--.-','ъ':'-..-','ы':'-.--','ь':'-.--.','э':'..-..','ю':'.-.-','я':'--.--'}

        let text = form.inputText.value
        let morseOutput = ''
        for(let i = 0;i < text.length;i++){
            let char = text[i].toLowerCase()
            //this is a shorthand expression to save the storage space on the ESP
            morseOutput += (char != ' ') ? (morseMap[char] ? morseMap[char] : '') : ' ' 

            //you could also write it something like this
            // let morseChar = ' '
            // if(char != ' '){
            //     morseChar = morseMap[char]
            //     if(morseChar == undefined){ //will happen if it's a non cyrillic char
            //         morseChar = '' //empty string
            //     }
            // }
            // morseOutput += morseChar
        }

        form.inputText.value = morseOutput //replace the text in the field with the morse code values
        return true
    }
   </script>
<body>
<form method='post' onsubmit='return textToMorse(this)' action='/'>
    <input type='text' id='inputText'>
    <input type='submit' value='Отправить'>
</form>
</body>
</html>

我写得很快,所以你可能需要重新检查代码,但它可能会给你一些想法

© www.soinside.com 2019 - 2024. All rights reserved.