2022年1月2日日曜日

mqtt service (esp32 and esp8266)

ーーーーーーーicecream free server ーーーーーーーーーーーーーーーーーーーーーーー

MQTTについてのまとめ — そこはかとなく書くよん。 ドキュメント (tdoc.info)

 https://take6shin-tech-diary.com/mqtt/ localでmqttブローカをたちあげる

一つの窓でブローカ開始してPub、もう一つの窓でSub 

Subは自動ダウンなし 購読しっぱなし Pubは、一回の出版ごとに自動ダウン

MQTTbrokerを使ってみる(その1)準備編|ゆう|note 無料のbroker記事

MQTTbrokerを使ってみる(その2)通信編|ゆう|note 同上

username(*)はfseigojpなどといれる client_idはランダムに出されている

username(no*)にicecreamといれ mqttxでmqtt.uko.jpにコネクト!

まずtopic名をきめてsubscribeしておく あとは、それに対してpublishするだけ

-------------node.js mqtt -------------------------test.mosquitto.org--------------------------------------

https://blog.mitsuruog.info/2015/02/what-mqtt.html を参考に

mqttxでanonymous接続してからsubscriptionでpresenceをつくると

node hello_mqtt.js のやりとりが観察できた

----------------bash mqtt ----public-mqtt5-broker----------------------------------------------------

https://qiita.com/ekzemplaro/items/0a03a96c2f5a5ba2ae55

------------------esp8266 for public mqtt server -------

コードではpublishしてsubscribeしてますが、publishは成功しませんでした
mqttxというclient appにesp8266-clientというusernameで入り、esp8266/testというtopicを
つくって適当なメッセージをpublishすると、arduinoのシリアルモニタで観察できました
今週末は、別のアルディーノでpublishして、同様になるか実験。。。

その後、次のように、したらうまくいった(セットアップでサブして、ループでパブ)
esp32でも同じだと思う ただ現実には自分でなげてうけるのは意味がない 
サブとパブは、本来別々のマイコンでうごくべき!

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char *ssid = ""; // Enter your WiFi name
const char *password = "";  // Enter WiFi password
const char *mqtt_broker = "broker.emqx.io";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
    // Set software serial baud to 115200;
    Serial.begin(115200);
    // connecting to a WiFi network
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.println("Connecting to WiFi..");
    }
    Serial.println("Connected to the WiFi network");
    //connecting to a mqtt broker
    client.setServer(mqtt_broker, mqtt_port);
    client.setCallback(callback);
    while (!client.connected()) {
        Serial.println("Connecting to public emqx mqtt broker.....");
        if (client.connect("esp8266-client")) {
            Serial.println("Public emqx mqtt broker connected");
        } else {
            Serial.print("failed with state ");
            Serial.print(client.state());
            delay(2000);
        }
    }
    // publish and subscribe
   
    client.subscribe("esp8266/test");
}

void callback(char *topic, byte *payload, unsigned int length) {
    Serial.print("Message arrived in topic: ");
    Serial.println(topic);
    Serial.print("Message:");
    for (int i = 0; i < length; i++) {
        Serial.print((char) payload[i]);
    }
    Serial.println();
    Serial.println("-----------------------");
}

void loop() {
    client.publish("esp8266/test", "hello emqx");
    client.loop();
    delay(1000);
}

-ーーーーーーesp32でフリーのMQTTを利用するーーtest.mosquitto.orgーーー

https://programresource.net/2020/05/23/3332.html : パブサブOK)

mqttxでanonymous loginしてESP32/TEST/TOPICをサブスクライブしておき

同時にESP32/TEST/TOPICをパブリッシュするようにしておく

あとは以下のコードを実行すると、コードからパブリッシュされるtest publishが

自動的にコードのサブスクライブを呼ぶ またmqttxでパブリッシュしたときは

それが自動的にコードのサブスクライブを呼ぶ

#include <PubSubClient.h>

#include <WiFi.h>


char ssid[] = "";

char pass[] = "";


const char* mqtt_server = "test.mosquitto.org";

const char* mqtt_topic = "ESP32/TEST/TOPIC";


WiFiClient mqttClient;

PubSubClient client(mqttClient);

char mqtt_clientid[32]; // uniqueである必要がある


void callback(char* topic, byte* payload, unsigned int length) {

    char payload_ch[32];

    int chlen = min(31, (int)length);

    memcpy(payload_ch, payload, chlen);

    payload_ch[chlen] = 0; // payload_chがc言語で扱える文字列となる

    Serial.println(payload_ch);

} //ここはsubscribeで起動されるコード片



void wait_mqtt() {

    if (!client.connected()) {

        Serial.print("Waiting MQTT connection...");

        while (!client.connected()) { // 非接続のあいだ繰り返す

            if (client.connect(mqtt_clientid)) { // ここでuniqueなmqtt_clientidで接続する

                client.subscribe(mqtt_topic); // ここで購読がセットされる

            } else {

                delay(2000);

            }

        }

        Serial.println("connected");

    }

}



void setup() {

    Serial.begin(115200);

    Serial.print("connecting wifi");

    WiFi.mode(WIFI_STA); // station mode 

    if (String(WiFi.SSID()) != String(ssid)) {

        WiFi.begin(ssid, pass);


    }

    WiFi.setSleep(false); // sleep omitted? 多分

    while (WiFi.status() != WL_CONNECTED) {

        delay(500);

        Serial.print(".");

    }

    Serial.println("connected");

    byte mac_addr[6];

    WiFi.macAddress(mac_addr);

    sprintf(mqtt_clientid, "ESP32CLI_%02x%02x%02x%02x%02x%02x", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);

    // ここでマックアドレスを用いてuniqueなclient_idを作成

    client.setServer(mqtt_server, 1883); // websocketでない場合のポート番号は1883

    client.setCallback(callback);

}


void loop() {

    int c ;

    wait_mqtt();

    client.loop();

    client.publish(mqtt_topic, "test publish"); //送信はこうで、自動的に購読のcallbackが呼ばれる

    Serial.println("sub");

    delay(1000);

}

ーーーーーabout esp8266 -- local mosquitto broker --一番現実的かも

https://tiagohorta1995.medium.com/mosquitto-mqtt-broker-and-esp8266-communcation-in-6-easy-steps-5ea0efae5a10 でローカルのmqtt brokerを

うごかしての記録 mossquitto.confを自作して再起動して成功  conf :: 以下の2行だけ

listener 1883

allow_anonymous true

アルディーノのコードはこれ やはりpublishとsubscribeは同居できんかった

別窓からパブしてOKだった

#include <ESP8266WiFi.h>

#include <PubSubClient.h>

// WiFi 

const char *ssid = "184F32CF8BF3-2G"; // Enter your WiFi name

const char *password = "2215085363556";  // Enter WiFi password

// MQTT Broker

const char *mqtt_broker = "192.168.3.9"; // get by hostname -I 

const char *topic = "test/topic";

const int mqtt_port = 1883;

WiFiClient espClient;

PubSubClient client(espClient);

void setup() {

 // Set software serial baud to 115200;

 Serial.begin(115200);

 

 // connecting to a WiFi network

 WiFi.begin(ssid, password);

 while (WiFi.status() != WL_CONNECTED) {

  delay(500);

  Serial.println("Connecting to WiFi..");

 }

 

 Serial.println("Connected to the WiFi network");

 

 //connecting to a mqtt broker

 client.setServer(mqtt_broker, mqtt_port);

 client.setCallback(callback);

 

 while (!client.connected()) {

 String client_id = "esp8266-client-";

 client_id += String(WiFi.macAddress());

 

 Serial.printf("The client %s connects to mosquitto mqtt broker\n", client_id.c_str());

 

 if (client.connect(client_id.c_str())) {

  Serial.println("Public emqx mqtt broker connected");

 } else {

  Serial.print("failed with state ");

  Serial.print(client.state());

  delay(2000);

 }

}

 

 // publish and subscribe

 client.publish(topic, "Hello From ESP8266!");

 client.subscribe(topic);

}

void callback(char *topic, byte *payload, unsigned int length) {

 Serial.print("Message arrived in topic: ");

 Serial.println(topic);

 Serial.print("Message:");

 

 for (int i = 0; i < length; i++) {

  Serial.print((char) payload[i]);

 }

 

 Serial.println();

 Serial.println(" - - - - - - - - - - - -");

}

void loop() {

 client.loop();

}


2021年12月31日金曜日

espr2② (SPIFFS, SoftAP, mDNS,)

 SPIFFS  ----------------------------------------------

https://www.mgo-tec.com/spiffs-filesystem-uploader01-html に詳しい

その応用がhttps://msr-r.net/espr-wifi-robot-1/で詳述(1〜5)

-----------------esp8266 SoftAccessPoint Webserever-------------

これは家庭内LANでなく、独自のAPをたてるので、Wifiでesp8266をえらび12345678を

入れるとOK 自宅内で監視サーバ(各種)をたてるのに便利

https://programresource.net/2020/02/26/3006.html を参照した 

mDNSはウィンドウズではうまくいかんというサイトをみかけた Ubuntuでは成功した

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#include <ESP8266mDNS.h>

#include <DNSServer.h>

//無線LANの設定 アクセスポイントのSSIDとパスワード

const char* ap_ssid = "ESP8266AP";      //APのSSID

const char* ap_password = "12345678";   //APのパスワード 8文字以上

IPAddress ip(192, 168, 1, 100);

IPAddress subnet(255, 255, 255, 0);

const byte DNS_PORT = 53;

DNSServer dnsServer;

ESP8266WebServer server(80);

 String toStringIp(IPAddress ip) {

    String res = "";

    for (int i = 0; i < 3; i++) {

        res += String((ip >> (8 * i)) & 0xFF) + ".";

    }

    res += String(((ip >> 8 * 3)) & 0xFF);

    return res;

}

 

void captivePortal() { //無効リクエストはすべてESP8266に向ける

    server.sendHeader("Location", String("http://") + toStringIp(server.client().localIP()), true);

    server.send(302, "text/plain", "");

    server.client().stop();

}

 

bool handleUrl(String path) {

    if (path.endsWith("/")){

         char chbuffer[64];

         sprintf(chbuffer,"Hello ESP8266");

         server.send(200,"text/plain",chbuffer);

        return true;

    }

    return false;

}

 

void setup() { //無線LAN接続APモード

    WiFi.mode(WIFI_AP);

    WiFi.softAPConfig(ip, ip, subnet);

    WiFi.softAP(ap_ssid, ap_password);

    dnsServer.start(DNS_PORT, "*", ip);

    WiFi.setSleepMode(WIFI_NONE_SLEEP);

 

    server.onNotFound([]() {

        if (!handleUrl(server.uri())) {

            captivePortal(); //ESP8266のページにリダイレクトする capative portalの仕組み

        }

    });

    server.begin();

}

 

void loop() {

    dnsServer.processNextRequest();

    server.handleClient();

}

面白かったのは、espr developper では、SoftAPをえらぶとデフォルトで

192.168.4.1と固定されること!

----------------------------ST mode-------------------------------------------------

localIPでブラウザするとLEDが2秒間だけ点灯

#include <ESP8266WiFi.h>

#include <ESP8266WebServer.h>

#define SSID ""

#define PASS ""

//80番ポートのWEBサーバー

ESP8266WebServer server(80);

void setup(){

  Serial.begin(9600);

  pinMode(13,OUTPUT);

  //WiFiに接続

  WiFi.begin(SSID, PASS);

  while(WiFi.status() != WL_CONNECTED){

    delay(500);

    Serial.print(".");

  }

  Serial.println("WiFi connected");

  Serial.println(WiFi.localIP());

   //WEBサーバー起動

  server.on("/", handleRoot);

  server.begin();

  Serial.println("Web Server started");

}

 void loop(){

  server.handleClient();  

}

void handleRoot(){

  server.send(200, "text/plain", "LED on about 2 second");

   digitalWrite(13,HIGH);

  delay(2000);

  digitalWrite(13,LOW);

---------------- ST with mDNS ------------------------------------------
https://www.petitmonte.com/robot/smartphone_led_server.html
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
const char* ssid     = "";
const char* password = "";
 
// 文字列ではなく、数値配列です。
IPAddress ip(192, 168, 3, 33);
IPAddress gateway(192, 168, 3, 1);
IPAddress netmask(255, 255, 255, 0);
 
const int PIN_LED = 5;
String html = "";
 
ESP8266WebServer server(80);
 
void setup(void){
  html = "<!DOCTYPE html>\
<html>\
<head>\
<meta charset=\"UTF-8\">\
<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,minimum-scale=1\">\
</head>\
<body>\
<br>\
<br>\
<br>\
<input type=\"button\" value=\"オン\" style=\"font-size:32px;\" onclick=\"location.href='/led-ON';\">&nbsp;&nbsp;&nbsp;\
<input type=\"button\" value=\"オフ\" style=\"font-size:32px;\" onclick=\"location.href='/led-OFF';\">\
</body>\
</html>";
 
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, LOW);
 
  Serial.begin(115200);
 
  // WIFI_AP, WIFI_STA, WIFI_AP_STA or WIFI_OFF
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway,netmask);    
  WiFi.begin(ssid, password);
  Serial.println("");
 
  // Wifi接続ができるまで待機
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("IPアドレス: ");
  Serial.println(WiFi.localIP());
  
  // ローカルネットワーク内のみ有効のmDNS(マルチキャストDNS)を開始
  // bool MDNSResponder::begin(const char* hostname){}
  if (MDNS.begin("petitmonte")) {
    Serial.println("mDNSレスポンダーの開始");
  }
 
  // トップページ
  server.on("/", [](){
    // HTTPステータスコード(200) リクエストの成功
    server.send(200, "text/html", html);     
  });
  
  // LEDをオン
  server.on("/led-ON", [](){
    digitalWrite(PIN_LED, HIGH);
    // HTTPステータスコード(200) リクエストの成功
    server.send(200, "text/html", html);      
  });
 
  // LEDをオフ
  server.on("/led-OFF", [](){
    digitalWrite(PIN_LED, LOW);
    // HTTPステータスコード(200) リクエストの成功
    server.send(200, "text/html", html);      
  });
 
  // 存在しないURLを指定した場合の動作を指定する
  server.onNotFound([](){
    // HTTPステータスコード(404) 未検出(存在しないファイルにアクセス)  
    server.send(404, "text/plain", "404");
  });
 
  server.begin();
  Serial.println("Webサーバーの開始");
}
 
void loop(void){  
  // Webサーバの接続要求待ち
  server.handleClient();
}

2021年12月21日火曜日

espr2① (install,speaker, with mic,pwm, led-server, lcd, switch)

---------------------------------------------------------------------------------------

https://www.mgo-tec.com/esp8266-board-install01-html を参考にインスト

https://www.mgo-tec.com/blog-entry-chip-info-esp-wroom-02-esp8266.html を

参考にflash size 4M設定にしたがOKだった

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

https://fabkura.gitbooks.io/arduino-docs/content/chapter7.htmlを参考に音出ししてみた

圧電スピーカ、受動ブザー、8ΩスピーカでOKだった

to micro ーーーーーーーーーーーーーーーーーーーーーーー

espr developper から ボーレート9600でハローをくりかえし送り出すスケッチを

かいてmicとつないだら成功した

from micro ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

SoftwareSerialを使ってESP8266とArduinoをつなぐ | disce Omnes (xdomain.jp)

を参考に、まずmicrobitにゆっくり送信させるプログラムをおく この場合P0送信、P1受信

serial.redirect(
SerialPin.P0,
SerialPin.P1,
BaudRate.BaudRate9600
)
basic.forever(function () {
    basic.pause(1000)
    serial.writeLine("hello")
    basic.pause(1000)
})

そしてespr2に以下のプログラムを置く
#include <SoftwareSerial.h>
SoftwareSerial swSer(14,12) // 14 as rx to counterpart tx , 12 tx

void setup(){
Serial.begin(9600);
swSer.begin(9600);
delay(50000); // 相手の用意を十分まつため
}
void loop() {
if (swSer.available())
Serial.write(swSer.read())
Serial.write('\n');
delay(100; // 適当
}
これはh e l l oを一文字づつ改行して表示する
----------pwm---------------------------------------------------
https://makers-with-myson.blog.ss-blog.jp/2017-01-14 を参考に
static unsigned int led = 13; void setup() { analogWriteFreq(2000); analogWriteRange(1000); } unsigned int duty=0; bool inc = true; void loop() { analogWrite(led, duty); if (inc) { if (duty++ == 1000) inc = false; } else { if (duty-- == 0) inc = true; } delay(1); }
ーーーー自宅LANでサーバをたてる(アクセスポイント方式ではない)ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
https://iot.keicode.com/esp8266/esp8266-webserver.php を参考に
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#define WIFI_SSID "Your Network's SSID"
#define WIFI_PWD "Password goes here"

ESP8266WebServer server(80);

// HTML
#define HTML_HEADER "<!doctype html>"\
  "<html><head><meta charset=\"UTF-8\"/>"\
  "<meta name=\"viewport\" content=\"width=device-width\"/>"\
  "</head><body>"
#define HTML_FOOTER "</body></html>"

void setup() {  
  Serial.begin(9600);
  WiFi.begin(WIFI_SSID, WIFI_PWD);
  // Wait until WiFi is connected
  Serial.println("");
  while(WiFi.status() != WL_CONNECTED){
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("Connected!");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());
  // Setup WebServer Handlers
  server.on("/", [](){
    String html = HTML_HEADER "<h1>NodeMCU!</h1>" HTML_FOOTER;
    server.send(200, "text/html", html);
  });

  server.on("/led/on", [](){
    String html = HTML_HEADER "<h1>LED ON</h1>" HTML_FOOTER;
    server.send(200, "text/html", html);
  });

  server.on("/led/off", [](){
    String html = HTML_HEADER "<h1>LED OFF</h1>" HTML_FOOTER;
    server.send(200, "text/html", html);
  });

  server.begin();
}

void loop() {
  server.handleClient(); // handleClient関数はライブラリ由来!
}
-------------------------------------------------------
http://twinklesmile.blog42.fc2.com/blog-entry-322.htmlのピンアサイン
でgnd,vcc(3v3),sda(io4),scl(io5)に結線し
https://www.losant.com/blog/how-to-connect-lcd-esp8266-nodemcuを参考に
addressだけ0x27にかえて成功 したが基本5V仕様なのでusb給電時に5Vがでる
voutにつないだほうがいい スイッチサイエンスのサイトに情報あった 
ESPr® Developer(ESP-WROOM-02開発ボード) - スイッチサイエンス (switch-science.com)
---------------------------------------------------------------
https://deviceplus.jp/hobby/arduino_f06/ を参考にinput_pullup
抵抗とジャンプワイア1本省略できる


2021年12月19日日曜日

raspico②(neopixel,lm61,bltin,lc1602,us, uart::espr or mic,oled)

WS2812 Neopixel LED with Raspberry Pi Pico (theelectronics.co.in)

import array, time

from machine import Pin

import rp2

# Configure the number of WS2812 LEDs.

NUM_LEDS = 8 

PIN_NUM = 6

brightness = 1

@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)

def ws2812():

    T1 = 2

    T2 = 5

    T3 = 3

    wrap_target()

    label("bitloop")

    out(x, 1)               .side(0)    [T3 - 1]

    jmp(not_x, "do_zero")   .side(1)    [T1 - 1]

    jmp("bitloop")          .side(1)    [T2 - 1]

    label("do_zero")

    nop()                   .side(0)    [T2 - 1]

    wrap()

 

 

# Create the StateMachine with the ws2812 program, outputting on pin

sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(PIN_NUM))

 

# Start the StateMachine, it will wait for data on its FIFO.

sm.active(1)

 

# Display a pattern on the LEDs via an array of LED RGB values.

ar = array.array("I", [0 for _ in range(NUM_LEDS)])

 

##########################################################################

def pixels_show():

    dimmer_ar = array.array("I", [0 for _ in range(NUM_LEDS)])

    for i,c in enumerate(ar):

        r = int(((c >> 8) & 0xFF) * brightness)

        g = int(((c >> 16) & 0xFF) * brightness)

        b = int((c & 0xFF) * brightness)

        dimmer_ar[i] = (g<<16) + (r<<8) + b

    sm.put(dimmer_ar, 8)

    time.sleep_ms(10)

 

def pixels_set(i, color):

    ar[i] = (color[1]<<16) + (color[0]<<8) + color[2]

 

def pixels_fill(color):

    for i in range(len(ar)):

        pixels_set(i, color)

 

def color_chase(color, wait):

    for i in range(NUM_LEDS):

        pixels_set(i, color)

        time.sleep(wait)

        pixels_show()

    time.sleep(0.2)

 

def wheel(pos):

    # Input a value 0 to 255 to get a color value.

    # The colours are a transition r - g - b - back to r.

    if pos < 0 or pos > 255:

        return (0, 0, 0)

    if pos < 85:

        return (255 - pos * 3, pos * 3, 0)

    if pos < 170:

        pos -= 85

        return (0, 255 - pos * 3, pos * 3)

    pos -= 170

    return (pos * 3, 0, 255 - pos * 3)

 

 

def rainbow_cycle(wait):

    for j in range(255):

        for i in range(NUM_LEDS):

            rc_index = (i * 256 // NUM_LEDS) + j

            pixels_set(i, wheel(rc_index & 255))

        pixels_show()

        time.sleep(wait)

 

BLACK = (0, 0, 0)

RED = (255, 0, 0)

YELLOW = (255, 150, 0)

GREEN = (0, 255, 0)

CYAN = (0, 255, 255)

BLUE = (0, 0, 255)

PURPLE = (180, 0, 255)

WHITE = (255, 255, 255)

COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE)

 

while 1:

    

    pixels_set(1,RED)

    pixels_set(3,BLUE)

    pixels_show()

    time.sleep(0.2)

    pixels_set(1,BLACK)

    pixels_set(3,BLACK)

    pixels_show()

    time.sleep(0.2)

 -------------------------------------------------------------------------------------


---------------------------------------------------------

LM61:: https://qiita.com/cakipy/items/0bc823ce909076344cb0 をもとに結線した

import machine

import utime

from machine import Pin

from micropython import const

from utime import sleep

sensor_temp = machine.ADC(2)

conversion_factor = 3.3 / (65535)

while True:

    reading = sensor_temp.read_u16() * conversion_factor

    temp_calc = (reading*1000-600) /10

    print("{0:.1f}".format(temp_calc) + "C")

----------------------------------------------------------------------------------------

【Raspberry Pi Pico】温度センサーをMicroPythonで読み取る方法 | メタエレ実験室 (hellobreak.net) 表示装置がないのでピコに入れずにthonnyのプロッタ出力してみた

なお内蔵のLEDはPin25で制御できる

----------------------------------------------------------------------------

 【Raspberry Pi Pico】I2C接続のLCDディスプレイを使う方法【MicroPython】 | メタエレ実験室 (hellobreak.net)   まずI2Cの番号を以下のコードでしらべる 

39だった(16進では0x27)

import machine
sda=machine.Pin(0)
scl=machine.Pin(1)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
print(i2c.scan())

 注:GitHub - dhylands/python_lcd: Python based library for talking to character based LCDs. からライブラリ2個をインストしてからmain.pyは以下

(インスト方法は https://www.youtube.com/watch?v=nek77AvP_pU を参照

まあ、そのライブラリを、その名でraspicoにセーブするだけでいいのだが。。。

なおyoutubeではレベルシフタもちいていたが、上記サイトでは使わず Vbus!)


import time
import machine
from esp8266_i2c_lcd import I2cLcd
I2C_ADDR = 0x27

sda = machine.Pin(0)
scl = machine.Pin(1)
# I2C start
i2c = machine.I2C(0,sda=sda, scl=scl, freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16) # 手持ちは4行だが2を4としてもだめだった)
lcd.putstr("It Works!\nSecond Line")

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

【Raspberry Pi Pico】超音波センサーで距離を測定する方法 | メタエレ実験室 (hellobreak.net) で簡単に成功 1kΩを3個つかって分圧するのがミソ

---------from espr to pico ----------------------------------------------------------------- 

espr2のtx,rx(デフォルト)からボーを9600にして"hello"を1秒ごとに

serial.printlnするだけ 3v3はラズピコの3v3outを利用、gndの共通化はお約束

マイクロビットとESPr Developerでシリアル通信する | さとやまノート (msr-r.net) を参考

raspicoでは以下を参考にした 受信データは一行で送られるのでまとめるのがコツ

pico-micropython-examples/uart.py at master · raspberrypi/pico-micropython-examples · GitHub 

from machine import UART,Pin

import time

u = UART(0,9600,tx=Pin(0),rx=Pin(1))

3rxData = bytes()

while True:

  while u.any() > 0:

    rxData += u.read(1)

 print(rxData.decode('utf-8'))

   time.sleep(0.3)

注:MicroPython的午睡(21) ラズパイPico、M5AtomLiteとUART通信 | デバイスビジネス開拓団 (jhalfmoon.com) を参考にu.readline()でもいけるかも。。。。

------------------------------from pico to espr --------------------------------------

at pico:: 

from machine import Pin, UART

import time

u=UART(0,9600,tx=Pin(0),rx=Pin(1))

for i in range(10):

    u.write(b"abc\n")

    time.sleep(1)

and at espr:: https://msr-r.net/serial-mb2esp/を参考に

#include <SoftwareSerial.h>

SoftwareSerial swSer(14, 12);

void setup() {

  Serial.begin(115200);

  swSer.begin(9600);

  Serial.println("\nSoftware serial test started");

}

void loop() {

  while (swSer.available() > 0) {

    Serial.println(swSer.readStringUntil('\n'));

    yield();

  }

}

----------------------------------------------------------------------

micro:bitとの交信はUARTブログに書いている 

結局、espr2とつながればwifi、micro:bitとつながればbluetoothができることになる

(その後、bluetooth moduleでもOKだった)

-------------------------------------------------------------------------------

【Raspberry Pi Pico】OLEDディスプレイ(I2C)に文字を描画する方法【MicroPython】 | メタエレ実験室 (hellobreak.net) 普通にできたRaspberry Pi Pico OLED Display (SSD1306) — Maker Portal (makersportal.com)も参考になった

2021年12月9日木曜日

raspico①(uart:: with PC, PIR, DHT, lcd-dht,SDCだめでした high-power-led)附:電源まわり

ーーーーーーーーーーーーpico/pcーーーーーーーーーーーーーーーーーーーーー

Raspberry Pi Pico MicroPython シリアル通信(UART) テスト - JH7UBCブログ (goo.ne.jp)

GitHub - raspberrypi/pico-micropython-examples: Examples to accompany the "Raspberry Pi Pico Python SDK" book.  

from machine import UART
import time
u=UART(1)
u.write('test\n\r')
time.sleep(0.1)
while True:
  if u.any() > 0
    u.write(u.read(1))
をmain.pyとしてpicoにのせてthonnyでもmain.pyコードを表示して矢印をおして

teratermして成功

-------------pir--------------------------------

Raspberry Pi Picoで人感センサーを使ってみる | メタエレ実験室 (hellobreak.net)

実験して成功した 人感センサの配線は以下を参考にした

micro:bit【マイクロビット】WebUSBによるプログラムの書き込み | micro:bit Lab.【マイクロビット】 (sanuki-tech.net) 

①では、Pin0がPULL_DOWNされているが、念のため、②の回路の51KΩ抵抗も併用した

電源はVSYSまたは3V3(OUT)でうごいた VBUSは5V出力なので使わなかった

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

DHT11 With Raspberry Pi Pico : 4 Steps - Instructables

serverあれこれ: Raspberry Pi PicoでDHT11センサーを使用して温度・湿度を取得する (serverarekore.blogspot.com) いずれもRASPI仕様の3V駆動のdht11だった

Weather Station with Raspberry Pi PICO and DHT11 - IoT Starters が5v駆動の

Arduino仕様についてかかっており、当然VBUSにつながっている(5vがでている)

3vにつなぐと不規則な動きとなる!

dht.pyは最初のサイトをコピペする 2個目のサイトはlib(firm本体)入れる方法など

書いているが、普通にraspicoルートにおけばよかった 2個目のサイトにあるinvalidエラー

は50msでも280msでもでなかったが、50のほうがきびきびしているので、そうした

from machine import Pin
import utime as time
from dht import DHT11, InvalidChecksum

time.sleep(1)
dht11 = DHT11(Pin(15))
while True:
    try:
        print("Temperature: {}".format(dht11.temperature))
        print("Humidity: {}".format(dht11.humidity))
    except InvalidChecksum:
        print("invalid checksum")
    time.sleep(2)
   
   

---------------------------------------------------------

import time

import machine

from esp8266_i2c_lcd import I2cLcd

I2C_ADDR=0x27

from machine import Pin

import utime as time

from dht import DHT11,InvalidChecksum


sda=machine.Pin(0)

scl=machine.Pin(1)

i2c=machine.I2C(0,sda=sda,scl=scl,freq=400000)

lcd=I2cLcd(i2c,I2C_ADDR,2,16)

lcd.putstr("hello")


time.sleep(1)

dht11=DHT11(Pin(15))

while True:

    try:

        lcd.clear()

        lcd.move_to(0,0)

        temp="temp:{}".format(dht11.temperature)

        humid="humid:{}".format(dht11.humidity)

        weather=temp+"\n"+humid

        lcd.putstr(weather)

    except InvalidChecksum:

        print("invalid checksum")

    time.sleep(2)

ーー 残念ながら、もはやこのコードはうごかん ーーーーーーーーーーーーーーーーーー

Raspberry Pi PicoのMicroPythonでSDカードを利用する – 楽しくやろう。 (boochow.com) いまは、ここにあるsdcard.pyしかみつけられん

【Raspberry Pi Pico】SDカードにファイルを書き込む方法 | メタエレ実験室 (hellobreak.net) これで紹介されていたファイルは消失していた

注:最後にos.umount('sd')を忘れずに!

from machine import Pin, SPI

import os, sdcard

spi = SPI(0)

sd = sdcard.SDCard(spi, Pin(28))

os.mount(sd, '/sd')

os.chdir('sd')

os.listdir()

print(open('readme.txt').read())

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

high power led:: 100 ohm for led,100k ohm for raspico 16 pin

from machine import Pin 

import utime

led = Pin(16, Pin.OUT) 

while True:

 led.value(1)

 utime.sleep(1)

 led.value(0)

 utime.sleep(1)

--------------------------------------------------------------

Raspberry Pi Pico調査 (zenn.dev) に電源まわりがくわしい

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

2021年12月2日木曜日

Ble :: esp32builtin,module for uno/esprdev/raspico cf. raspico install

手持ちのhc06については以下がくわしい

Arduino and Bluetooth module HC-06 • AranaCorp

-- esp32 has ble ------以下をandroid bluetooth serial terminal で成功------------------

#include <BluetoothSerial.h>

#define LED_PIN 5

BluetoothSerial SerialBT;

void setup() {

  SerialBT.begin("ESP32LED");      

// esp32のble機能に「ESP32LED」という名前をつけて初期化

  Serial.begin(115200);            // シリアルモニタの初期化

  pinMode(LED_PIN, OUTPUT);        // LED用のピンの初期化

}

void loop() {

  if (SerialBT.available()) {      // Bluetoothシリアルに受信したかどうかを調べる

    char ch = SerialBT.read();     // 受信した文字を得る

    Serial.println(ch);            // 受信した文字をシリアルモニタに出力

    if (ch == '1') {               // 受信した文字が「1」の場合

      digitalWrite(LED_PIN, HIGH); // LEDを点灯する

    }

    else if (ch == '0') {          // 受信した文字が「0」の場合

      digitalWrite(LED_PIN, LOW);  // LEDを消灯する

    }

  }

}

bluetooth module for arduino --------------------------------------------

1個目の  bluetooth module 失敗 BROKENと命名

https://wireless-network.net/arduino-win-bt/   hc6とhc5の違いが詳しい

AT command is valuable!  in https://nefastudio.net/2015/02/20/3850.html 

どうも、ここでいろいろいじって送付時の状態を変化させてしまったようだ

2個目は出荷時のままで実験 hc-05 でペアリングできた  

2個目の出荷設定は、ROLE 0,UART 9600,0,0, CMOD 1 だったので、

BROKENも、それにしたら治った!

以下のコード成功 https://thinkit.co.jp/story/2013/03/06/3995?page=0%2C1(VCCをVINに入れるのがコツかもしれない? 要再検!)

HC-05 Bluetooth Module with Arduino-MIT App Inventor - Bing video では5v駆動

https://create.arduino.cc/projecthub/electropeak/getting-started-with-hc-05-bluetooth-module-arduino-e0ca81 では5v駆動だが分圧必要とある。。。。

esp32と違い,bleモジュール非力なためか、ボーレートを9600にして成功(要再検!)

void setup() {

  Serial.begin(9600);

  pinMode(13,OUTPUT);

}

void loop() {

  if (Serial.available() > 0) {

    char c = Serial.read();

      if (c == 'n') {

       digitalWrite(13, HIGH);

       } else if(c == 'f') {

       digitalWrite(13, LOW);

       }

  }

}

 bluetooth module for espr2 ーーーーーーーーーーーーーーーーーーーーー

ちなみに上記コードはEsprDevでも動いた ボーはやはり9600!!

電源は3v3もしくはVout5Vから取る必要があった(VIN,TOUTではだめだった)

bluetooth moduleはarduino用なのでvoutからとる 3.6v以上で駆動というサイトも

みかけたが手持ちは3v3で動いたわ

ーーBLEーーーーーraspico ーーーーーーーーーーーーーーーーーーーーーーーーー

これでbluetooth serial terminalでoを押すとLEDが1秒ONする raspicoは5vを持ってる

だが多分3.3vでもいけるはず

from machine import Pin,UART
import time

uart=UART(0,9600,tx=Pin(0),rx=Pin(1))
led = machine.Pin(15,Pin.OUT)

time.sleep(2)

while True:
        c = uart.readline()
        if c == b'o':
            print("hit")
            led.value(1)
            time.sleep(1)
            led.value(0)
       

https://blog.goo.ne.jp/jh7ubc/e/e31b062f42e221c2b76eb74799c17107 をもとに

machine.UART 使い方|uPyC|note や

https://jhalfmoon.com/dbc/2021/05/13/micropython%E7%9A%84%E5%8D%88%E7%9D%A121-%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4pico%E3%80%81m5atomlite%E3%81%A8uart%E9%80%9A%E4%BF%A1/ も参考にして

成功した、ボーレートは9600が基本、readlineではb'test\n'などが受け取れるが

BluetoothSerialTerminalでoを入れると以下のコードではb'o',b'\r',b'\n'となる

from machine import Pin, Timer, UART
import time
uart1 = UART(1, 115200, tx=Pin(4), rx=Pin(5))
while True:
ret = uart1.readline()
if ret is not None:
print(ret)
----------RASPICO INSTALL MEMO -----------------------------------------------------------

 https://projects.raspberrypi.org/en/projects/getting-started-with-the-pico/5 を


参考にpip3 install thonnyしたがtkinterないとしかられる

https://python.keicode.com/advanced/tkinter-install.php#2-2 を参考に

インスト firmwareをいれるときブートボタンをおしつつさす、

PR認識されたらボタンをはなしインストすればOK   

main.pyだけが本体にインストできる名前 PCには任意の名前でおけるが。。。

ファイル保存できる ブートボタンはリセットでないので、USB抜き差しが必要!