師走も後半に突入しました。

年末の群馬への帰省をどうしようかと迷っています。自家用車のタイヤ交換も済んでいません。あ~年賀状もこれからです。。。

仙台に居る長女も、どうやら今年は仙台で年を越す様です。

 

それからご存じの方もいらっしゃると思いますが、

だそうです。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