2026年10月3日土曜日

tinygo on pico with esp01 :: wifi connect and ip get code

package main

import (
    "fmt"
    "machine"
    "strings"
    "time"
)

const (
    SSID     = "Pikara2-91d8e4"
    PASSWORD = ""
)

// ==================================================
// ATコマンドをESP-01へ送信して応答を表示
// ==================================================
func sendAT(uart *machine.UART, cmd string, wait time.Duration) string {

    fmt.Println("=> Send:", cmd)

    // ATコマンド送信
    uart.Write([]byte(cmd + "\r\n"))

    var buf [256]byte
    var response strings.Builder

    start := time.Now()

    for time.Since(start) < wait { // wait時間内は応答をまつ

        // TinyGoでは Read() は (int, error)
        n, _ := uart.Read(buf[:])

        if n > 0 {
            s := string(buf[:n])
            // 応答を保存
            response.WriteString(s)
            // 受信内容を表示
            fmt.Print(s)
            // OKなら終了
            if strings.Contains(response.String(), "OK") {
                break
            }
            // ERRORなら終了
            if strings.Contains(response.String(), "ERROR") {
                break
            }
        }

        time.Sleep(10 * time.Millisecond)
    }

    return response.String()
}

// ==================================================
// ESP-01のAT+CIFSR応答からIPアドレスを抽出
//
// 例:
// +CIFSR:STAIP,"192.168.1.20"
// ==================================================
func extractIP(s string) string {

    lines := strings.Split(s, "\n")

    for _, line := range lines {

        line = strings.TrimSpace(line)

        if strings.Contains(line, "STAIP") {

            // 最初の " を探す
            start := strings.Index(line, `"`)

            if start < 0 {
                continue
            }

            // 2個目の " を探す
            end := strings.Index(line[start+1:], `"`)

            if end < 0 {
                continue
            }

            return line[start+1 : start+1+end]
        }
    }

    return ""
}

// ==================================================
// メイン
// ==================================================
func main() {
    // ==================================================
    // Raspberry Pi Pico
    //
    // GP0 = UART0 TX -> ESP-01 RX
    // GP1 = UART0 RX <- ESP-01 TX
    //
    // GND ------------- GND
    // ==================================================
    uart := machine.UART0
    uart.Configure(machine.UARTConfig{
        BaudRate: 115200,
        TX:       machine.GP0,
        RX:       machine.GP1,
    })
    // ESP-01起動待ち
    time.Sleep(3 * time.Second)

    fmt.Println()
    fmt.Println("================================")
    fmt.Println(" Raspberry Pi Pico + ESP-01")
    fmt.Println(" WiFi connection")
    fmt.Println("================================")
    fmt.Println()
    // ==================================================
    // UART受信バッファをクリア 空読みで
    // ==================================================
    var dummy [64]byte
    for uart.Buffered() > 0 {
        _, _ = uart.Read(dummy[:])
    }
    // ==================================================
    // ESP-01動作確認
    // ==================================================
    response := sendAT(
        uart,
        "AT",
        1*time.Second,
    )
    if strings.Contains(response, "ERROR") {
        fmt.Println("ESP-01 did not respond.")
        return
    }
    // ==================================================
    // Wi-Fi Stationモード
    // ==================================================
    sendAT(
        uart,
        "AT+CWMODE=1",
        1*time.Second,
    )
    // ==================================================
    // Wi-Fiアクセスポイントへ接続
    // ==================================================
    cmd := `AT+CWJAP="` + SSID + `","` + PASSWORD + `"`

    fmt.Println()
    fmt.Println("Connecting to WiFi...")
    fmt.Println("SSID:", SSID)

  // 十分時間をとってアクセスする 

   response = sendAT(
        uart,
        cmd,
        20*time.Second,
    )

    // Wi-Fi接続エラー
    if strings.Contains(response, "ERROR") {

        fmt.Println()
        fmt.Println("WiFi connection failed.")
        return
    }

    // ==================================================
    // IPアドレス取得
    // ==================================================

    fmt.Println()
    fmt.Println("Getting IP address...")

    response = sendAT(
        uart,
        "AT+CIFSR",
        3*time.Second,
    )

    // ==================================================
    // IPアドレス抽出
    // ==================================================

    ip := extractIP(response)

    fmt.Println()

    if ip != "" {

        fmt.Println("==============================")
        fmt.Println(" WiFi connected!")
        fmt.Println()
        fmt.Println(" IP address:", ip)
        fmt.Println("==============================")

    } else {

        fmt.Println("==============================")
        fmt.Println(" IP address could not be obtained.")
        fmt.Println("==============================")
    }

    // ==================================================
    // ここで停止
    // ==================================================

    for {
        time.Sleep(1 * time.Second)
    }
}

0 件のコメント:

コメントを投稿