2024年11月25日月曜日

memo / aki-esp01 and pic / mcc /esp01(3v) and picocom / esp01(5v) and pico

https://qiita.com/sukinasaki/items/426068d6e87169fa3d88 ;; raspi keyboard japanize

https://qiita.com/kummn/items/411d6a501eaf61162e8f ;; ATコマンド集

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

2階の電波強度が悪い::アンドロイドアプリのwifiミレルで2階の2G強度を測定すると
30〜40%と黄色信号となります、あかーん

秋月のesp8266は工場出荷時にATモードです 電源コードはuartを兼ねており通信傍受OK
逆引き本wifi-pc.x、わかりやすいのトライくりかえしました
AT+CWJAPで謎のエラー頻発 携帯のテザリングで成功しました 
アンドロイドアプリのtcp udp server clientというので10回まではポテンショ値が読み取れ
11回目からはエラーとなりだす問題多いコードですが後閑さんのご愛嬌?
副産物としてlinuxソフトのpicocomで通信傍受できるようになりました
picocom -b 115200 --omap crcrlf /dev/ttyUSB0 (その後--omap crcrlf不要と判明)
ちなみにttyUSB0lはs /dev/tty*でを探しました
esp01(3v) 、esp01(5v)でも成功しました(傍受方法は下記にしるず)
これらはPICを3v・5v駆動いずれでも成功しました
 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

逆引きの162頁 esp01からのレスを無視する問題多いコード

まずhighly recommend にしたがいmcc versionを上げた 

esuart はstdio redirect にチェックがはいっていた そのためであろうか

mccのgetchとstdioのgetchがtype conflictしたのでpropertyでc90を適用実施、

しかし、下記のコードではprintfつかってないので、上記のチェックをはずしても動いた

C99にプロパティ変えても動いた 後閑さんの混乱?多分

TX,RXはpin-manager.cをみて了解した pin18:rx,pin17:txだった

傍受にはFTDIのrxをpin18,txをpin17につけると傍受できる!

/*****************************************

 *  Wi-Fi テストプログラム

 *  Wi-FiPC

*****************************************/

#include "mcc_generated_files/mcc.h"

/* 送信データ */

uint8_t Buf[] = "POT = x.xx Volt\r\n";

int result, i;

float Volt;

/* WiFi設定用コマンドデータ */

const uint8_t Mode[] = "AT+CWMODE=1\r\n";

//const uint8_t Join[] = "AT+CWJAP=\"Bufflalo-2G-8340\",\"636nsa535ds3v\"\r\n";

const uint8_t Join[] = "AT+CWJAP=\"HUAWEI@nova@lite@3+\",\"99991111\"\r\n";

//const uint8_t Open[] = "AT+CIPSTART=\"TCP\",\"192.168.11.8\",8000\r\n";

const uint8_t Open[] = "AT+CIPSTART=\"TCP\",\"192.168.43.1\",8080\r\n";

const uint8_t Send[] = "AT+CIPSEND=17\r\n";       // 転送開始

const uint8_t Close[] = "AT+CIPCLOSE\r\n";        // サーバ接続解除

const uint8_t Shut[]  = "AT+CWQAP\r\n";           // Ap接続解除

/* 関数プロトタイプ */

void SendCmd(const uint8_t *cmd);

void ftostring(int seisu, int shousu, float data, uint8_t *buffer);

/***** メイン関数 *****/

void main(void)

{

    SYSTEM_Initialize();    // システム初期化

    /** APとサーバに接続  15秒ディレイを多めにした***/

    __delay_ms(5000);  

    __delay_ms(5000); 

    __delay_ms(5000);  

    SendCmd(Mode);          // Station Mode

    __delay_ms(5000);       // 5sec待ち

   __delay_ms(5000);       // 5sec待ち

  __delay_ms(5000);       // 5sec待ち

    SendCmd(Join);          

    __delay_ms(5000);       // 5sec待ち

    __delay_ms(5000);       // 5sec待ち

   __delay_ms(5000);       // 5sec待ち

    SendCmd(Open);          // サーバ(PC)と接続

    __delay_ms(2000);       // 2sec待ち    

    while (1)

    {

        /*** データ10回送信 ****/

        for(i=0; i<10; i++){

            LED_SetHigh();                  // 目印ON

            result = ADC_GetConversion(POT);// AD変換

            Volt = (result * 3.3) / 1023;   // 電圧に変換

            ftostring(1, 2, Volt, Buf+6);   // 文字列に変換

            /** Wi-Fi送信開始 ***/


            SendCmd(Send);          // 文字送信開始

            SendCmd(Buf);           // データ送信実行


            LED_SetLow();           // 目印オフ

            __delay_ms(3000);       // 繰り返し3秒待ち

        }

        /*** APとサーバから切り離し ****/

        SendCmd(Close);             // サーバ接続解除

        SendCmd(Shut);              // AP接続解除        

    }

}

/********************************

 * WiFiコマンド送信関数

 *  遅延挿入後戻る

 ********************************/

void SendCmd(const uint8_t *cmd)

{

    while(*cmd != 0)            // 文字列の終わりまで繰り返し

        EUSART_Write(*cmd++);   // 1文字送信し次の文字へ

    __delay_ms(1000);           // 1秒待ち 応答受信無視

}

/***********************************

* Floatから文字列へ変換

* 合計有効桁は8桁以下とすること

***********************************/

void ftostring(int seisu, int shousu, float data, uint8_t *buffer)

{

    int i;

    long dumy;


    if(shousu != 0)                         //小数部桁ありか

        buffer += seisu+shousu+1;           //全体桁数+小数点

    else                                    //小数部桁なしのとき

        buffer += seisu + shousu;           //全体桁数のみ

    buffer--;                               //配列ポインタ-1

    for(i=0; i<shousu; i++)                 //小数部を整数に変換

        data = data * 10;                   //10倍

    // dumyがオーバーフローすると変換不可(8桁が限界)

    dumy = (long) (data + 0.5);             //四捨五入して整数に変換

    for(i=shousu; i>0; i--) {           //小数桁数分繰り返し

        *buffer =(uint8_t)(dumy % 10)+'0';//数値を文字に変換格納

        buffer--;                           //格納場所下位から上位へ

        dumy /= 10;                         //次の桁へ

    }

    if(shousu != 0) {                       //小数桁0なら小数点なし

        *buffer = '.';                      //小数点を格納

        buffer--;                           //ポインタ-1

    }

    for(i=seisu; i>0; i--) {                //整数桁分繰り返し

        *buffer = (uint8_t)(dumy % 10)+'0';//数値を文字に変換格納

        buffer--;                           //ポインタ-1

        dumy /= 10;                         //次の桁へ

    }

}


0 件のコメント:

コメントを投稿