kaluma ide on chromeではconnectでピコとつないで左画面のコードがflashで書き込まれた!
packageもいけるかどうかは、未踏。。。。
「ArduinoをWebサーバーにする」方法が最も簡単で確実です。Arduino R4 WiFiの標準ライブラリ(WiFiS3)だけで完結
1. Arduino側のコード
以下のスケッチをコピーして、SSIDとパスワードを書き換えて書き込んでください。/led/on で点灯、/led/off で消灯します。
#include "WiFiS3.h"
char ssid[] = "あなたのSSID";
char pass[] = "あなたのパスワード";
WiFiServer server(80);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) delay(500);
server.begin();
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
WiFiClient client = server.available();
if (client) {
String req = client.readStringUntil('\r');
if (req.indexOf("GET /led/on") != -1) digitalWrite(LED_BUILTIN, HIGH);
if (req.indexOf("GET /led/off") != -1) digitalWrite(LED_BUILTIN, LOW);
client.println("HTTP/1.1 200 OK\n\nOK");
client.stop();
}
}
※ 書き込み後、シリアルモニタに表示される IPアドレス をメモしてください。
2. Go言語側のコード
Goからは標準の http パッケージを使って、ArduinoのURLを叩くだけです。
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
// ArduinoのIPアドレスに書き換えてください
baseURL := "http://192.168.x.x"
for {
// LED ON
fmt.Println("LED ON")
http.Get(baseURL + "/led/on")
time.Sleep(1 * time.Second)
// LED OFF
fmt.Println("LED OFF")
http.Get(baseURL + "/led/off")
time.Sleep(1 * time.Second)
}
}
コードは注意してご使用ください。
この方法のメリット
ライブラリ不要&安定性: Arduino R4 WiFi公式の WiFiS3 ライブラリを使うため、接続が非常に安定します。
拡張性: ブラウザから http://IPアドレス/led/on と入力するだけでも操作OK
まずは ArduinoのシリアルモニタにIPアドレスが表示されるか 確認してみてください!=>数回unoのリセットをかけんとipが0.0.0.0となる、secrets.h必要?
ーーーーーーーーーーーーーーーーーーーーーーーーー
softapの場合はsecrets.h設定不要だった
#include "WiFiS3.h"
// アクセスポイントの設定
char ssid[] = "UNO-R4-AP"; // 任意のSSID
char pass[] = "password"; // 8文字以上のパスワード
int status = WL_IDLE_STATUS;
WiFiServer server(80); // 80番ポートでサーバーを起動
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
// APを作成
Serial.print("Creating access point named: ");
Serial.println(ssid);
status = WiFi.beginAP(ssid, pass);
if (status != WL_AP_LISTENING) {
Serial.println("Creating access point failed");
while (true);
}
// サーバー起動
server.begin();
// IPアドレス表示
IPAddress ip = WiFi.localIP();
Serial.print("AP IP address: ");
Serial.println(ip);
}
void loop() {
WiFiClient client = server.available(); // クライアントの接続を待つ
if (client) {
Serial.println("new client");
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
// HTTPレスポンスの送信
client.println("HTTP/1.1 200 OK");
client.println("Content-type:t
client.println();
client.print("Click <a href=\"/H\">here</a> to turn the
LED on.<br>");
client.print("Click <a href=\"/L\">here</a> to turn the
LED off.<br>");
client.println();
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
// URLによるLED制御
if (currentLine.endsWith("GET /H")) {
digitalWrite(LED_BUILTIN, HIGH);
}
if (currentLine.endsWith("GET /L")) {
digitalWrite(LED_BUILTIN, LOW);
}
}
}
client.stop();
Serial.println("client disconnected");
}
}
scratchino,johnfive同様にuart制御である、ラズパイやesp8266でもOKみたい
package main
import (
"time"
"gobot.io/x/gobot"
"gobot.io/x/gobot/drivers/gpio"
"gobot.io/x/gobot/platforms/firmata"
)
func main() {
adaptor := firmata.NewAdaptor("COM8")
led := gpio.NewLedDriver(adaptor, "13")
work := func() {
gobot.Every(1*time.Second, func() {
led.Toggle()
})
}
robot := gobot.NewRobot("bot",
[]gobot.Connection{adaptor},
[]gobot.Device{led},
work,
)
robot.Start()
}
Arduino Uno R4(Minima / WiFi共通)で、Tera Termなどのシリアルモニタから文字を入力して、オンボードのBuilt-in LED(L)をオン/オフするArduinoコードです。
void setup() {
// シリアル通信を開始 (ボーレートは115200)
Serial.begin(115200);
// LEDのピンを出力に設定
pinMode(LED_BUILTIN, OUTPUT);
Serial.println("Arduino Uno R4 LED Control");
Serial.println("Type '1' to turn ON, '0' to turn OFF");
}
void loop() {
// シリアルデータが届いているか確認
if (Serial.available() > 0) {
char incomingByte = Serial.read(); // 1バイト読み込み
if (incomingByte == '1') {
digitalWrite(LED_BUILTIN, HIGH); // LEDオン
Serial.println("LED: ON");
}
else if (incomingByte == '0') {
digitalWrite(LED_BUILTIN, LOW); // LEDオフ
Serial.println("LED: OFF");
}
}
}
[設定] -> [シリアルポート] で、ボーレート(Speed)を 115200 に設定します。[設定] -> [端末] で、改行コードを 送信: CR+LF、受信: CR+LF に設定します(必須ではありませんが推奨)。1 を入力するとLEDが点灯します。0 を入力するとLEDが消灯します。 package main
import (
"fmt"
"html/template"
"log"
"net/http"
"os"
"strings"
"sync"
)
// テンプレート用データ
type PageData struct {
Temp string
Humid string
}
var (
tmpl *template.Template
once sync.Once
)
// テンプレート読み込み
func initTemplate() {
var err error
tmpl, err = template.ParseFiles("index.html")
if err != nil {
log.Fatalf("テンプレート読み込み失敗: %v", err)
}
}
func handler(w http.ResponseWriter, r *http.Request) {
once.Do(initTemplate)
if r.Method != http.MethodGet {
http.Error(w, "GETのみ対応", http.StatusMethodNotAllowed)
return
}
query := r.URL.Query()
temp := query.Get("temp")
humid := query.Get("humid")
// ------------------------
// データ保存
// ------------------------
if temp != "" && humid != "" {
log.Printf("受信 temp=%s humid=%s\n", temp, humid)
file, err := os.OpenFile("data.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Println("保存エラー:", err)
} else {
defer file.Close()
line := fmt.Sprintf("temp=%s,humid=%s\n", temp, humid)
file.WriteString(line)
}
}
// ------------------------
// / の場合 data.txt 読み込み
// ------------------------
if temp == "" && humid == "" {
b, err := os.ReadFile("data.txt")
if err == nil {
lines := strings.Split(string(b), "\n")
for i := len(lines) - 1; i >= 0; i-- {
if lines[i] != "" {
line := lines[i]
parts := strings.Split(line, ",")
if len(parts) == 2 {
t := strings.Split(parts[0], "=")
h := strings.Split(parts[1], "=")
if len(t) == 2 && len(h) == 2 {
temp = t[1]
humid = h[1]
}
}
break
}
}
}
}
data := PageData{
Temp: temp,
Humid: humid,
}
err := tmpl.Execute(w, data)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
func main() {
http.HandleFunc("/", handler)
addr := "192.168.150.188:8080"
log.Println("サーバ起動 http://" + addr)
err := http.ListenAndServe(addr, nil)
if err != nil {
log.Fatal(err)
}
}