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)
}
}
※
※ 筆者の手書きメモ
※ 筆者の手書きメモ
※ 筆者の手書きメモ