師走も後半に突入しました。
年末の群馬への帰省をどうしようかと迷っています。自家用車のタイヤ交換も済んでいません。あ~年賀状もこれからです。。。
仙台に居る長女も、どうやら今年は仙台で年を越す様です。
それからご存じの方もいらっしゃると思いますが、
だそうです。8N1SS(仮想のコールサイン(笑))の運用(by 亀井さんあたり)にも期待したいですね。
ドップラーシフトによる受信周波数の5kHz程度の偏差あり なるほどね~
緊急車両が近づいて来るときと、離れて行く時にサイレン周波数が変化(高→低)する、あのドップラー効果に依る受信周波数偏移ですね。
さて、
からの続きになります。
ATコマンドでWebサーバーを起動してみました。
以下差分(関数)のみの紹介【updated 2020/12/20】
/************************************************************************
*
* FILE :Web_Server_Test1.c
* DATE :2020/12/20
* DESCRIPTION :ARM-First DEMO PROGRAM
* CPU TYPE :STM32F405 & ESP8266 w/AT command
* AUTHOR :jk1brk
* NOTE:
*
************************************************************************/
#include <time.h>
#include <LiquidCrystal.h>
const int rs = PA4, en = PB11, d4 = PC13, d5 = PB8, d6 = PB12, d7 = PC7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
String lcddata[2] = {"",""};
void get2str(char *buf);
void lcdprint(String data);
String atout(String data);
void initWiFi();
/* Web server test */
void web_server_test1(){
char linebuf[512];
char doctype1[] = "<!DOCTYPE html>";
char doctype2[] = "<html lang='ja'>";
char doctype3[] = "<head><meta charset='utf-8'><title>Web Server Test</title></head>";
char doctype4[] = "<body><h1>";
char doctype5[] = "Hello world!"; //
char doctype6[] = "</h1></body></html>";
char title[] = "Web Server Test";
Serial.println(title);
lcdprint(title);
while(1){
get2str(linebuf);
String me = linebuf;
String mes = me.substring(me.indexOf(',')+1, me.indexOf("\n")-1);
if (mes == "CONNECT") {
Serial.println(me);
lcdprint(me.substring(me.indexOf(',')-1, me.indexOf("\n")-1));
// Web Page Heading
atout("AT+CIPSEND=0,15");
atout(doctype1);
atout("AT+CIPSEND=0,16");
atout(doctype2);
atout("AT+CIPSEND=0,65");
atout(doctype3);
atout("AT+CIPSEND=0,10");
atout(doctype4);
atout("AT+CIPSEND=0,12"); //
atout(doctype5);
atout("AT+CIPSEND=0,19");
atout(doctype6);
} else if (mes == "CLOSED") {
Serial.println(me);
lcdprint(me.substring(me.indexOf(',')-1, me.indexOf("\n")-1));
Serial.print("Restart:");
break;
}
}
}
void setup() {
// put your setup code here, to run once:
delay(1000);
Serial.begin(115200);
lcd.begin(16, 2);
delay(100);
initWiFi();
// set up web server
atout("AT+CIPMUX=1");
atout("AT+CIPSERVER=1,80");
}
void loop() {
// put your main code here, to run repeatedly:
web_server_test1();
}
/* Serial2 reading */
void get2str(char *buf){
int n;
for(n = 0;; n++){
while(!Serial2.available());
buf[n] = Serial2.read();
if(buf[n] == '\r') break;
}
buf[n] = '\0';
Serial2.read();
}
/* lcd print routine */
void lcdprint(String data){
lcddata[0] = lcddata[1];
lcddata[1] = data;
lcd.setCursor(0, 0);
lcd.print(lcddata[0]+" ");
lcd.setCursor(0, 1);
lcd.print(lcddata[1]+" ");
}
/* AT commans output */
String atout(String data) {
String resp = "";
String res;
SerialUART2.println(data); //AT command output at UART2
while (1) {
while (!SerialUART2.available()); //waiting for a response
res = SerialUART2.readStringUntil(10);
resp += res;
if(res.indexOf("OK") != -1) return resp; //OK response
if(res.indexOf("ERROR") != -1) return ""; //ERROR response
}
}
/* WiFi initilize */
void initWiFi(){
pinMode(PB1, OUTPUT);
digitalWrite(PB1, LOW);
delay(100);
digitalWrite(PB1, HIGH);
for(int n = 0; n < 5; n++){
Serial.print("*");
lcd.print("*");
delay(1000);
}
Serial.println();
Serial2.begin(115200);
delay(100);
while(Serial2.available()){
Serial2.read();
}
String ssid = atout("AT+CWJAP_CUR?");
String sid = ssid.substring(ssid.indexOf("CWJAP_CUR:")+10, ssid.indexOf(','));
Serial.println("WLAN SSID:" + sid);
String sr = atout("AT+CIFSR");
String lip = sr.substring(sr.indexOf("CIFSR:STAIP")+13, sr.indexOf("CIFSR:STAMAC")-3); // depend on the environment
Serial.println("Local IP:" + lip);
lcdprint(lip);
delay(100);
}
上記以外の関数は、
を参照願います。
なお、本記事を参照されて行った実験の結果に関しては、自己責任扱いでお願いします。
セキュリティーの観点でその脆弱性に課題が残ります。
【参照記事】
【参考記事】
https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf
https://www.espressif.com/sites/default/files/documentation/4b-esp8266_at_command_examples_en.pdf