#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "WiFi.h"
// 创建一个LCD对象,用于操作LCD显示屏
LiquidCrystal_I2C LCD(0x27, 16, 2);
// 凯撒密码函数,用于加密或解密文本
String caesarCipher(String input, int shift) {
String output = "";
for (int i = 0; i < input.length(); i++) {
char c = input[i];
// 对小写字母进行加密或解密
if (c >= 'a' && c <= 'z') {
c = (c - 'a' + shift + 26) % 26 + 'a';
// 对大写字母进行加密或解密
} else if (c >= 'A' && c <= 'Z') {
c = (c - 'A' + shift + 26) % 26 + 'A';
}
// 将加密或解密后的字符添加到输出字符串
output += c;
}
return output;
}
void setup() {
// 初始化串口通信,波特率设置为115200
Serial.begin(115200);
// 提示用户输入要加密或解密的文本
Serial.println("输入要加密/解密的文本(使用小写字母)并按ENTER键:");
// 提示用户输入偏移量
Serial.println("然后输入偏移量(0-25)并按ENTER键:");
// 设置WiFi为STA模式
WiFi.mode(WIFI_STA);
// 初始化LCD显示屏
LCD.init();
// 打开LCD背光
LCD.backlight();
// 在LCD上显示启动信息
LCD.print("WiFi Scanning...");
}
void loop() {
// 清除LCD显示屏
LCD.clear();
// 在LCD上显示扫描信息
LCD.print("Scanning...");
// 扫描WiFi网络
int n = WiFi.scanNetworks();
// 等待扫描完成
delay(500);
if (n == 0) {
// 如果没有找到网络,显示“没有找到网络”
LCD.print("No networks found.");
} else {
// 如果找到网络,显示“扫描完成”
LCD.print("Scan done!");
// 遍历所有找到的网络
for (int i = 0; i < n; ++i) {
// 设置LCD光标位置,打印网络信息
LCD.setCursor(0, 0);
LCD.print("Net:");
LCD.print(i + 1);
LCD.print(" SSID: ");
LCD.print(WiFi.SSID(i));
LCD.setCursor(0, 1);
LCD.print("Ch:");
LCD.print(WiFi.channel(i));
LCD.print(" RSSI:");
LCD.print(WiFi.RSSI(i));
LCD.print(" dBm");
// 根据加密类型打印是否加密
LCD.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " Open" : " *");
// 每显示一个网络信息后等待2秒
delay(2000);
}
}
// 处理串口输入
if (Serial.available() > 0) {
String input = "";
bool hasNewLine = false;
// 读取直到遇到换行符
while (Serial.available() > 0) {
char c = (char)Serial.read();
if (c == '\n') {
hasNewLine = true;
break;
}
input += c;
}
if (hasNewLine) {
// 读取偏移量
int shift;
while (!Serial.available());
shift = Serial.parseInt();
// 清除输入缓冲区
while (Serial.available()) Serial.read();
// 检查偏移量是否有效
if (shift >= -26 && shift <= 26) {
// 执行加密或解密操作
String result = caesarCipher(input, shift);
// 打印加密或解密后的文本
Serial.print("Encrypted/Decrypted text: ");
Serial.println(result);
// 在LCD上显示加密或解密结果
LCD.clear();
LCD.print("Encrypted/Decrypted:");
LCD.setCursor(0, 1);
LCD.print(result);
} else {
// 如果偏移量无效,打印错误信息
Serial.println("Invalid shift value. It should be between -26 and 26.");
}
}
}
// 等待一段时间后再次扫描
delay(3000);
}