雑感
2026年11月9日月曜日
tinygo on raspberry pi pico (aqm0802)
import (
"fmt"
"machine"
"time"
)
const (
LCD_ADDR = 0x3E
)
var i2c = machine.I2C0
// LCDコマンド送信
func lcdCommand(cmd byte) {
data := []byte{0x00, cmd}
err := i2c.Tx(LCD_ADDR, data, nil)
if err != nil {
fmt.Println("LCD Command ERROR:", err)
}
time.Sleep(2 * time.Millisecond)
}
// LCDデータ送信
func lcdData(value byte) {
data := []byte{0x40, value}
err := i2c.Tx(LCD_ADDR, data, nil)
if err != nil {
fmt.Println("LCD Data ERROR:", err)
}
}
// LCD初期化
func lcdInit() {
time.Sleep(50 * time.Millisecond)
lcdCommand(0x38)
lcdCommand(0x39)
lcdCommand(0x14)
lcdCommand(0x70)
lcdCommand(0x56)
lcdCommand(0x6C)
time.Sleep(200 * time.Millisecond)
lcdCommand(0x38)
lcdCommand(0x0C)
lcdCommand(0x01)
time.Sleep(5 * time.Millisecond)
lcdCommand(0x06)
fmt.Println("LCD Initialize OK")
}
// カーソル位置指定
func lcdPosition(row byte, col byte) {
if row == 0 {
lcdCommand(0x80 + col)
} else {
lcdCommand(0xC0 + col)
}
}
// 文字列表示
func lcdPrint(str string) {
for i := 0; i < len(str); i++ {
lcdData(str[i])
}
}
// メイン処理
func main() {
fmt.Println("AQM0802 Start")
// I2C0設定 GP4 / GP5
err := i2c.Configure(machine.I2CConfig{
SDA: machine.GP4,
SCL: machine.GP5,
Frequency: 100000,
})
if err != nil {
fmt.Println("I2C ERROR:", err)
for {
time.Sleep(time.Second)
}
}
fmt.Println("I2C Configure OK")
time.Sleep(500 * time.Millisecond)
// LCD初期化
lcdInit()
// 1行目
lcdPosition(0, 0)
lcdPrint("TinyGo!!")
// 2行目
lcdPosition(1, 0)
lcdPrint("AQM0802")
fmt.Println("LCD Display OK")
for {
time.Sleep(time.Second)
}
}
tinygo with esp01でhttp get (ドラフト)
以下をリファクタする。。。。tinygo flash -target pico -monitor ./main.goで成功
tinygo monitorはなかなか起動しない。。。
package main
import (
"fmt"
"machine"
"strings"
"time"
)
const (
SSID = "HUAWEInovalite3+"
PASSWORD = "99991111"
)
// ==================================================
// 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)
}
}
2026年11月6日金曜日
池澤の日本文学全集 近現代作家3冊
近現代作家1
明治以降の作家の名品を精選し、作品の時代背景順に収める『近現代作家集』。三巻 にわたってお届けする。モダニズム、自然主義、プロレタリア久生十蘭「無月物語」
神西清「雪の宿り」
芥川龍之介「お富の貞操」泉鏡花「陽炎座」
永井荷風「松葉巴」
宮本百合子「風に乗って来るコロポックル」
金子光晴「どくろ杯(抄)」
佐藤春夫「女誡扇綺譚」
横光利一「機械」
高村薫「晴子情歌(抄)」 *
岡本かの子「鮨」*
武田泰淳 汝の母を!
長谷川四郎 駐屯軍演芸大会
里見弴 いろおとこ
安岡章太郎 質屋の女房
色川武大 空襲のあと
坂口安吾 青鬼の褌を洗う女
結城昌治 終着駅(抄)
中野重治 五勺の酒
太宰治 ヴィヨンの妻*
井上ひさし 父と暮せば
井伏鱒二 白毛
吉行淳之介 鳥獣虫魚
久保田万太郎 三の酉
安部公房 誘惑者
室生犀星 鮠の子
川端康成 片腕
三島由紀夫 孔雀
上野英信 地の底の笑い話(抄)
大庭みな子 青い狐
日本文学の未来を切り拓く名品18篇
内田百閒 日没閉門
野呂邦暢 鳥たちの河口
幸田文 「崩れ」(抄)
富岡多惠子 動物の葬禮
村上春樹 午後の最後の芝生
鶴見俊輔 イシが伝えてくれたこと
池澤夏樹 連夜
津島佑子 鳥の涙
筒井康隆 魚籃観音記
河野多惠子 半所有者
堀江敏幸 スタンス・ドット
向井豊昭 ゴドーを尋ねながら
金井美恵子 『月』について、
稲葉真弓 桟橋
多和田葉子 雪の練習生(抄)なお全部読んだ*
川上弘美 神様/神様2011
川上未映子 三月の毛糸
円城塔 The History of the Decline and Fall of the Galactic Empire
2026年11月5日木曜日
mqtt on webmite パブリッシュとサブスクを同時にやってみた
2026年11月2日月曜日
ArduinoESPAT on uno r3
このライブラリはArduino実用入門のESP8266ライブラリより簡便だった
ゼロからよくわかるArduino電子工作入門 改定2版
2026年11月1日日曜日
Tinygo on raspberry pi pico with EPS01-AT,ssd1306,dht11
家のネットがあれなんでスマホのテザリングをつかった
package main
import (
"machine"
"strconv"
"time"
)
const (
ssid = "HUAWEInovalite3+"
password = "99991111"
)
// UARTからデータが返ってくるのを待って読み込む関数
func sendATCommand(uart *machine.UART, cmd string, timeout time.Duration) string {
println("送信:", cmd)
uart.Write([]byte(cmd + "\r\n"))
// 応答を待つ
start := time.Now()
var response []byte
buf := make([]byte, 64)
for time.Since(start) < timeout {
if uart.Buffered() > 0 {
n, _ := uart.Read(buf)
response = append(response, buf[:n]...) //
resStr := string(response)
if hasSubstring(resStr, "OK\r\n") || hasSubstring(resStr, "ERROR\r\n") {
break
}
}
time.Sleep(10 * time.Millisecond)
}
return string(response)
}
// 簡易文字列含まれるか判定
func hasSubstring(s, sub string) bool {
if len(sub) == 0 {
return true
}
for i := 0; i <= len(s)-len(sub); i++ {
if s[i:i+len(sub)] == sub {
return true
}
}
return false
}
func main() {
time.Sleep(3 * time.Second)
println("\n--- TinyGo ESPAT Direct AT Command Control ---")
// 1. UART1の初期化 (配線: GP4=TX, GP5=RX)
uart := machine.UART1
err := uart.Configure(machine.UARTConfig{
BaudRate: 115200,
TX: machine.GP4,
RX: machine.GP5,
})
if err != nil {
println("UART初期化失敗")
return
}
// 2. モジュールの生存確認
println("\n[1/4] 生存確認中...")
res := sendATCommand(uart, "AT", 1*time.Second)
println("応答:\n", res)
// 3. Wi-Fiモードを「Station」に設定
println("\n[2/4] Wi-Fiモード設定中...")
res = sendATCommand(uart, "AT+CWMODE=1", 1*time.Second)
println("応答:\n", res)
// 4. アクセスポイントに接続
println("\n[3/4] Wi-Fiアクセスポイントに接続中...")
joinCmd := `AT+CWJAP="` + ssid + `","` + password + `"`
res = sendATCommand(uart, joinCmd, 10*time.Second)
println("応答:\n", res)
// 5. TCP接続を確立 (example.com)
println("\n[4/4] TCP接続テスト (example.com)...")
res = sendATCommand(uart, `AT+CIPSTART="TCP","example.com",80`, 3*time.Second)
println("応答:\n", res)
// 🚨 修正:Hostヘッダーを含んだ正しいHTTP/1.1リクエストを作成
req := "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n"
sendCmd := "AT+CIPSEND=" + strconv.Itoa(len(req))
res = sendATCommand(uart, sendCmd, 1*time.Second)
println("応答:\n", res)
// 実際のHTTPリクエストを送信
uart.Write([]byte(req))
// 🚨 修正:サーバーからの返信データを漏らさず溜める受信ループ
println("\n--- 受信データ (HTTP Response) ---")
var finalResponse []byte
readBuf := make([]byte, 128)
// データが流れ終わるまで、または3秒タイムアウトまでループ
readStart := time.Now()
for time.Since(readStart) < 3*time.Second {
if uart.Buffered() > 0 {
n, _ := uart.Read(readBuf)
finalResponse = append(finalResponse, readBuf[:n]...)
// データを受信したらタイムアウトタイマーを少し延長して追従する
readStart = time.Now()
}
time.Sleep(20 * time.Millisecond)
}
// 取得した生データを一括表示
print(string(finalResponse))
println("\n---------------------------------")
}
tinygo monitor
Connected to /dev/ttyACM0. Press Ctrl-C to exit.
--- TinyGo ESPAT Direct AT Command Control ---
[1/4] 生存確認中...
送信: AT
応答:
AT
OK
[2/4] Wi-Fiモード設定中...
送信: AT+CWMODE=1
応答:
AT+CWMODE=1
OK
[3/4] Wi-Fiアクセスポイントに接続中...
送信: AT+CWJAP="HUAWEI@nova@lite@3+","99991111"
応答:
AT+CWJAP="HUAWEI@nova@lite@3+","99991111"
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
OK
[4/4] TCP接続テスト (example.com)...
送信: AT+CIPSTART="TCP","example.com",80
応答:
AT+CIPSTART="TCP","example.com",80
CONNECT
OK
送信: AT+CIPSEND=56
応答:
AT+CIPSEND=56
OK
>
--- 受信データ (HTTP Response) ---
Recv 56 bytes
SEND OK
+IPD,927:HTTP/1.1 200 OK
Date: Sun, 01 Nov 2026 04:00:21 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
S
Age: 14269
cf-cache-status: HIT
CF-RAY: a537fdf6794fd3f5-KIX
alt-svc: h3=":443"; ma=86400
241
<!doctype html><html langh,initial-scale=1"><title>Example Domain</title><style>html{color-scheme:light dark;background:light-dark(#eee,#222)}body{font:1</head><body><p>This domain is for use in documentation examples without needing permission. This is not a service; avoid relyin
CLOSED
----------ssd1306 gpio4,gpio5でないと出ん,gpio0,gpio1はuart専用みたい!---------------------
package main
import (
"image/color"
"machine"
"time"
"tinygo.org/x/drivers/ssd1306"
"tinygo.org/x/tinyfont"
"tinygo.org/x/tinyfont/freesans"
)
func main() {
println("Starting SSD1306")
// I2C0 初期化
err := machine.I2C0.Configure(machine.I2CConfig{
SDA: machine.GP4,
SCL: machine.GP5,
Frequency: 100 * machine.KHz,
})
if err != nil {
println("I2C initialization failed:", err.Error())
return
}
println("I2C initialized")
// SSD1306 初期化
display := ssd1306.NewI2C(machine.I2C0)
display.Configure(ssd1306.Config{
Address: 0x3C,
Width: 128,
Height: 64,
})
println("SSD1306 initialized")
time.Sleep(time.Millisecond * 200)
// 画面クリア
display.ClearDisplay()
white := color.RGBA{
R: 255,
G: 255,
B: 255,
A: 255,
}
// 文字表示
tinyfont.WriteLine(
display,
&freesans.Regular12pt7b,
10,
25,
"Hello",
white,
)
tinyfont.WriteLine(
display,
&freesans.Regular12pt7b,
10,
50,
"TinyGo",
white,
)
// OLED更新
err = display.Display()
if err != nil {
println("Display error:", err.Error())
return
}
println("Display completed")
for {
time.Sleep(time.Second)
}
}
---------------------------------------------------------------------------------
package main
import (
"fmt"
"machine"
"time"
"tinygo.org/x/drivers/dht"
)
func main() {
// DHT11 DATA → Pico GP0
pin := machine.GP0
sensor := dht.New(pin, dht.DHT11)
for {
// 温度と湿度を同時に取得
temp, hum, err := sensor.Measurements()
if err != nil {
fmt.Printf("DHT11 Error: %v\n", err)
} else {
fmt.Printf(
"Temperature: %d.%d C, Humidity: %d.%d %%\n",
temp/10,
temp%10,
hum/10,
hum%10,
)
} // DHT11は最低でも約1秒空ける
time.Sleep(2 * time.Second)
}
}
2026年10月31日土曜日
Esp01-AT and Uno R3 ドラフト
空スケッチをいれてuno r3にesp01をtx,rxをクロスしないで接続する
ATを入れる際に、baudrateが115200でないと接続できんのを確かめた!
ソフトシリアルを使うときは9600にする必要があるらしいが以下のサンプルコードは
115200でesp01と通信しているようだ。。。ゼロからよくわかる!Arduino電子工作 より