2021年11月28日日曜日

IRQ/MULTICORE (irq :: arduino/espr2/esp32, dualcore :: raspico,esp32)

Arduinoの割り込み機能を使ってみる | 物を作る者 (novicengineering.com) を

参考にしたが、タクトスイッチでは、一方に5Vをいれ、片方に10kプルダウン抵抗を入れて

その間からPin2への入力を取った 

attachInterruptの使い方 | 物を作る者 (novicengineering.com) によると

割り込みではdelayは利かんのも体験した1

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

Esp32 GPIO 割り込みについて

https://blog.goo.ne.jp/jh7ubc/e/8c97dc4bfad4f93d44301f8341083a69

INPUT_PULLUPについては http://7ujm.net/micro/arduino_int.html および

https://e-words.jp/w/%E3%83%97%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E6%8A%B5%E6%8A%97.html を参考に勉強した 

#define LED_Pin 27
#define SW_Pin 33
volatile int state = LOW;
 
void setup() {
  pinMode(SW_Pin, INPUT_PULLUP);
  pinMode(LED_Pin, OUTPUT);
  attachInterrupt(SW_Pin, LED_blink, FALLING);
}

void loop() {
  digitalWrite(LED_Pin, state);
}

void LED_blink(){
  delay(10);
  state = !state;
}

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

ここよりマルチコア

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

Multithreaded on Raspberry Pi Pico (MicroPython) - ElectroSoftCloud とても簡単

import machine
import utime
import _thread
# We configure the pin of the internal led as an output and
# we assign to internal_led
internal_led = machine.Pin(25, machine.Pin.OUT)
# Function that will block the thread with a while loop
# which will simply display a message every second
def second_thread():
while True:
print("Hello, I'm here in the second thread writting every second")
utime.sleep(1)
# Function that initializes execution in the second core
# The second argument is a list or dictionary with the arguments
# that will be passed to the function.
_thread.start_new_thread(second_thread, ())
# Second loop that will block the main thread, and what it will do
# that the internal led blinks every half second
while True:
internal_led.toggle()
utime.sleep(0.25) ---------------------------------------------------using semaphore--------------------
import machine
import utime
import _thread
# We configure the pin of the internal led as an output and
# we assign to internal_led
internal_led = machine.Pin(25, machine.Pin.OUT)
# We create a semaphore (A.K.A lock)
baton = _thread.allocate_lock()
# Function that will block the thread with a while loop
# which will simply display a message every second
def second_thread():
while True:
# We acquire the traffic light lock
baton.acquire()
print("Hello, I'm here in the second thread writting every second")
utime.sleep(1)
# We release the traffic light lock
baton.release()
# Function that initializes execution in the second core
# The second argument is a list or dictionary with the arguments
# that will be passed to the function.
_thread.start_new_thread(second_thread, ())
# Second loop that will block the main thread, and what it will do
# that the internal led blinks every half second
while True:
# We acquire the semaphore lock
baton.acquire()
internal_led.toggle()
utime.sleep(0.25)
# We release the semaphore lock
baton.release()

ーーーーーーーー-dual core usingーーーーーーーーーーーーーーーーーーーーーーーーー

https://programresource.net/2020/02/25/2994.html -> esp32 dual core program

https://robo.mydns.jp/Lecture/?%C5%C5%BB%D2%B9%A9%BA%EE/ESP32#va27dec2 

https://www.mgo-tec.com/blog-entry-arduino-esp32-multi-task-dual-core-01.html

いずれも粗い議論だが、入門には便利 以下のサイトはとても有益だった

 https://www.kerislab.jp/posts/2017-06-24-esp32-dual-core/ このままうごいた

#include "esp32-hal-log.h"
#include "freertos/task.h"

void task0 (void* arg) {
  while (1) {
    log_i("This is Core 0");
    delay(1000);
  }
}

void task1 (void* arg) {
  while (1) {
    log_i("This is Core 1");
    delay(1500);
  }
}

void setup () {
  log_i("Hello, this is ESP32:)");
  xTaskCreatePinnedToCore(task0, "Task0", 4096, NULL, 1, NULL, 0);
  xTaskCreatePinnedToCore(task1, "Task1", 4096, NULL, 1, NULL, 1);
}

void loop () {
  delay(1500);

2021年11月18日木曜日

esp32➂SoftAp, LC1602,@Uno,SDC,BME、 US,OLED,TOUCH,wifi-led-onoff

-----soft access point ---------------------

http://mukujii.sakura.ne.jp/esp2.html-

--------LC1602--------------------------------------------------------------------

https://entotsu44.hatenablog.com/entry/2019/12/31/080000 でlibraryがだめかも

とコンパイル中にコメントでるが強行して成功 なお、ピンアサインが手持ちと違うので

そこは要調整であった scl,sdaはコンパイル中は外しておくのは基本事項

(シリアルやSPIも同様だが)

---------UART WITH ARDUINO, SD-CARD -----------------------------------------------

arduino とのシリアル通信 教科書どうりだった 電源レベルちがうのに不思議

SDカードモジュール:教科書どうりだった 5v駆動で

--------------------------------- BME --------------------------------------------------

 J3を半田して、SDOをGNDにして0x76として、SCKを22ピン、SDIを21ピン

VCCは3.3v、GndはGNDにつなぎ 以下のコードでesp32devkitcで成功

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h> 

 

Adafruit_BME280 bme; // I2C

 

void setup() {

    Serial.begin(9600);

    while(!Serial);    // time to get serial running

    Serial.println(F("BME280 test"));

 .

    unsigned status;

     status = bme.begin(0x76);

    Serial.println();

}


void loop() { 

    printValues();

    delay(2000);

}

 

void printValues() {

    Serial.print("Temperature = ");

    Serial.print(bme.readTemperature());

    Serial.println(" *C");

 

    Serial.print("Pressure = ");

    Serial.print(bme.readPressure() / 100.0F);

    Serial.println(" hPa");

 

    Serial.print("Humidity = ");

    Serial.print(bme.readHumidity());

    Serial.println(" %");

 

    Serial.println();

}


ーーーーーーーーーーーーーー超音波センサーーーーーーーーーーーーーーーーーー
https://mirushirutechru.com/techru/7578/ このとおり で成功
--------------------------------OLED graphic display --------------------------------------
https://wak-tech.com/archives/825#i を参考に ただし秋月から購入したのはGND,VCCが逆だったので微調整した! でもって、成功
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
https://qiita.com/suigin/items/dcf704c05e98a00acae8 で内蔵タッチセンサに成功
above site によればPin2のみT2と数字が一致している 

---------no blynk by esp32 --------------------------------

https://wak-tech.com/archives/719#i-3 を参考

510Ωがないので330+220で代用したがOKだった 26ピンのみ実装

シリアルモニタでserver-IP確認

/*********  Rui Santos

  Complete project details at http://randomnerdtutorials.com  

*********/


// Wi-Fiライブラリをインポート

#include <WiFi.h>


// Wi-Fi接続情報を入力

const char* ssid     = "";

const char* password = "";


// ウェブサーバーをポート80で開始

WiFiServer server(80);


// HTTPリクエストを保存しておく変数

String header;


// ピンの状態を保存する変数の宣言

String output26State = "off";

String output27State = "off";


// 使用するピンに名前を付ける

const int output26 = 26;

const int output27 = 27;


void setup() {

  Serial.begin(115200);

  // ピンを二つとも出力ピンに割り当て

  pinMode(output26, OUTPUT);

  pinMode(output27, OUTPUT);

  // 2つのピンをオフ(LEDをオフ)

  digitalWrite(output26, LOW);

  digitalWrite(output27, LOW);


  // ssidとpasswordを用いてWi-Fiに接続

  Serial.print("Connecting to ");

  Serial.println(ssid);

  WiFi.begin(ssid, password);

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

    delay(500);

    Serial.print(".");

  }

  // IPアドレスを出力し、webserverをスタート

  Serial.println("");

  Serial.println("WiFi connected.");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

  server.begin();

}


void loop(){

  WiFiClient client = server.available();   //クライアント(スマホやPCなど)がつながっているかどうかをclientに出力


  if (client) {                             // クライアントが来たとき

    Serial.println("New Client.");          

    String currentLine = "";                // クライアントからくるデータを格納する変数

    while (client.connected()) {            // クライアントがつながっている間、以下をループ

      if (client.available()) {             // クライアントからデータが来ているとき

        char c = client.read();             // データを読み込み

        Serial.write(c);                    // 届いたデータをシリアルモニタに出力

        header += c;

        if (c == '\n') {                    // 届いたデータが改行コードだった時

          // もし現在の行が空白ならば、この改行コードのみ受け取る

          // つまりHTTPリクエストの終わりなので、レスポンスを返す

          if (currentLine.length() == 0) {

            // HTTPヘッダは(HTTP/1.1 200 OK)のようなステータスコードから始まる

            // 次にコンテントタイプを送信。今回はhtml形式なので以下のようにする

            client.println("HTTP/1.1 200 OK");

            client.println("Content-type:text/html");

            client.println("Connection: close");

            client.println();

            

            // リクエストに従ってGPIOをスイッチする

            if (header.indexOf("GET /26/on") >= 0) {

              Serial.println("GPIO 26 on");

              output26State = "on";

              digitalWrite(output26, HIGH);

            } else if (header.indexOf("GET /26/off") >= 0) {

              Serial.println("GPIO 26 off");

              output26State = "off";

              digitalWrite(output26, LOW);

            } else if (header.indexOf("GET /27/on") >= 0) {

              Serial.println("GPIO 27 on");

              output27State = "on";

              digitalWrite(output27, HIGH);

            } else if (header.indexOf("GET /27/off") >= 0) {

              Serial.println("GPIO 27 off");

              output27State = "off";

              digitalWrite(output27, LOW);

            }

            

            // htmlを表示

            client.println("<!DOCTYPE html><html>");

            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");

            client.println("<link rel=\"icon\" href=\"data:,\">");

            // ON/OFFボタンのためのCSS 

            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");

            client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");

            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");

            client.println(".button2 {background-color: #555555;}</style></head>");

            

            // ページ本体(bodyタグ内)

            client.println("<body><h1>ESP32 Web Server</h1>");

            

            // 現在のピンの状態と、オンオフ用のボタンを出力

            client.println("<p>GPIO 26 - State " + output26State + "</p>");

            // output26Stateがオフなら、ONにするボタンを表示

            if (output26State=="off") {

              client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");

            } else {

              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");

            } 

               

            // 27ピンの状態と、オンオフボタン

            client.println("<p>GPIO 27 - State " + output27State + "</p>");

            // If the output27State is off, it displays the ON button       

            if (output27State=="off") {

              client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");

            } else {

              client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");

            }

            client.println("</body></html>");

            

            // HTTPレスポンスの最後は改行で終了

            client.println();

            // whileループの終了

            break;

          } else { // 改行コードを取得したら、currentLineをリセット

            currentLine = "";

          }

        } else if (c != '\r') {  // 改行以外の何かしらのコードが来ているとき

          currentLine += c;      // currentLineに追加

        }

      }

    }

    // ヘッダーをリセット

    header = "";

    // 接続をリセット

    client.stop();

    Serial.println("Client disconnected.");

    Serial.println("");

  }

}

2021年11月8日月曜日

esp32② BlynkでLEDオンオフがespr2でもでけた、esp32-cam

---blynk by esp32---------------------

https://wak-tech.com/archives/1546 で遠隔Lチカでけた

https://github.com/blynkkk/blynk-library からライブラリを入手してインスト

あとは以下のとおり

#define BLYNK_PRINT Serial

#include <WiFi.h>

#include <WiFiClient.h>

#include <BlynkSimpleEsp32.h>

#define LED 32

//自分の環境に合わせて変更

char auth[] = " ";

char ssid[] = "";

char pass[] = "";

int LED_Flag = 0;

void setup()

{  //LED settings

  pinMode(LED,OUTPUT);

  digitalWrite(LED,HIGH);

  delay(200);

  digitalWrite(LED,LOW);

  Serial.begin(115200);

  Blynk.begin(auth, ssid, pass);

  Serial.println("connected");

}

void loop()

{

  Blynk.run();

}


BLYNK_WRITE(V0) 

{ // BLYNK_WRITEはlibrayにあるのであろう V0は32と紐付けられたのであろう

  LED_Flag = param.asInt();

  if(LED_Flag == 1){

    L_chika();   

  }

}


void L_chika(){

  Serial.println("LED ON");

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

      digitalWrite(LED,HIGH);

      delay(200); 

      digitalWrite(LED,LOW);

      delay(200);

  }

}


------------------------------------------- blynk by esp8266 -----------------------------

https://www.instructables.com/Blynk-With-ESP8266/ にしたがい

esp8266のライブラリを入手(blynkReleasse版)そのlibrariesのなかの

BlynkESP8266_libをarduinoのlibrarriesにコピー

上記のサイトにしたがいdev boardでesp8266_standaloneをえらぶ

でてきたコードを以下のように改変

https://wak-tech.com/archives/1546#i を参考にLEDを13とした


  1. /*************************************************************
  2.   Download latest Blynk library here:
  3.     https://github.com/blynkkk/blynk-library/releases/latest

  4.   Blynk is a platform with iOS and Android apps to control
  5.   Arduino, Raspberry Pi and the likes over the Internet.
  6.   You can easily build graphic interfaces for all your
  7.   projects by simply dragging and dropping widgets.

  8.     Downloads, docs, tutorials: http://www.blynk.cc
  9.     Sketch generator:           http://examples.blynk.cc
  10.     Blynk community:            http://community.blynk.cc
  11.     Follow us:                  http://www.fb.com/blynkapp
  12.                                 http://twitter.com/blynk_app

  13.   Blynk library is licensed under MIT license
  14.   This example code is in public domain.

  15.  *************************************************************
  16.   This example runs directly on ESP8266 chip.

  17.   Note: This requires ESP8266 support package:
  18.     https://github.com/esp8266/Arduino

  19.   Please be sure to select the right ESP8266 module
  20.   in the Tools -> Board menu!

  21.   Change WiFi ssid, pass, and Blynk auth token to run :)
  22.   Feel free to apply it to any other example. It's simple!
  23.  *************************************************************/

  24. /* Comment this out to disable prints and save space */
  25. #define BLYNK_PRINT Serial

  26. /* Fill-in your Template ID (only if using Blynk.Cloud) */
  27. //#define BLYNK_TEMPLATE_ID   "YourTemplateID"


  28. #include <ESP8266WiFi.h>
  29. #include <BlynkSimpleEsp8266.h>

  30. // You should get Auth Token in the Blynk App.
  31. // Go to the Project Settings (nut icon).
  32. char auth[] = "";
  33. // Your WiFi credentials.
  34. // Set password to "" for open networks.
  35. char ssid[] = "";
  36. char pass[] = "";
  37. #define LED 13
  38. int LED_Flag = 0;
  39. void setup()
  40. {
  41.   // Debug console
  42.   Serial.begin(9600);
  43.   pinMode(LED,OUTPUT);
  44.   digitalWrite(LED,HIGH);
  45.   delay(200);
  46.   digitalWrite(LED,LOW);
  47.   Blynk.begin(auth, ssid, pass);
  48.   Serial.println("connected");
  49. }

  50. void loop()
  51. {
  52.   Blynk.run();
  53. }
  54. BLYNK_WRITE(V0)
  55. {
  56.   LED_Flag = param.asInt();
  57.   if(LED_Flag == 1){
  58.     L_chika();   
  59.   }
  60. }

  61. void L_chika(){
  62.   Serial.println("LED ON");
  63.   for(int i=0;i<5;i++){
  64.       digitalWrite(LED,HIGH);
  65.       delay(200); 
  66.       digitalWrite(LED,LOW);
  67.       delay(200);
  68.   }
  69. }
  70. ーーーーーーーーーーーーーーーーーーーーーーーー
  71. https://note.com/fun2tommy/n/neafb2354dca3 をもとに接続

    ボードはesp32 wrover module,upload speed 921600,flash frequency 80mhz,

    flash mode QIO,partition scheme Huge App(3Mb no OTA/1Mb SPIFS),

    core debug level なし,シリアルポートdev/ttyUSB0にして

    sketch example::esp32 -> camera -> camerawebserverをえらび

    camera_model_wrover_kitをコメントアウトして

    camera_model_AI_THINKERをデコメントする

    コンパイル後は、ジャンパピンをはずし、リセットして

    シリアルモニタでIPを確認する IPをブラウザでみて画面のstart streamを押すと画面がでる


    #include "esp_camera.h"

    #include <WiFi.h>


    //

    // WARNING!!! PSRAM IC required for UXGA resolution and high JPEG quality

    //            Ensure ESP32 Wrover Module or other board with PSRAM is selected

    //            Partial images will be transmitted if image exceeds buffer size

    //


    // Select camera model

    //#define CAMERA_MODEL_WROVER_KIT // Has PSRAM

    //#define CAMERA_MODEL_ESP_EYE // Has PSRAM

    //#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM

    //#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM

    //#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM

    //#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM

    #define CAMERA_MODEL_AI_THINKER // Has PSRAM

    //#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM


    #include "camera_pins.h"


    const char* ssid = "184F32CF8BF3-2G";

    const char* password = "2215085363556";


    void startCameraServer();


    void setup() {

      Serial.begin(115200);

      Serial.setDebugOutput(true);

      Serial.println();


      camera_config_t config;

      config.ledc_channel = LEDC_CHANNEL_0;

      config.ledc_timer = LEDC_TIMER_0;

      config.pin_d0 = Y2_GPIO_NUM;

      config.pin_d1 = Y3_GPIO_NUM;

      config.pin_d2 = Y4_GPIO_NUM;

      config.pin_d3 = Y5_GPIO_NUM;

      config.pin_d4 = Y6_GPIO_NUM;

      config.pin_d5 = Y7_GPIO_NUM;

      config.pin_d6 = Y8_GPIO_NUM;

      config.pin_d7 = Y9_GPIO_NUM;

      config.pin_xclk = XCLK_GPIO_NUM;

      config.pin_pclk = PCLK_GPIO_NUM;

      config.pin_vsync = VSYNC_GPIO_NUM;

      config.pin_href = HREF_GPIO_NUM;

      config.pin_sscb_sda = SIOD_GPIO_NUM;

      config.pin_sscb_scl = SIOC_GPIO_NUM;

      config.pin_pwdn = PWDN_GPIO_NUM;

      config.pin_reset = RESET_GPIO_NUM;

      config.xclk_freq_hz = 20000000;

      config.pixel_format = PIXFORMAT_JPEG;

      

      // if PSRAM IC present, init with UXGA resolution and higher JPEG quality

      //                      for larger pre-allocated frame buffer.

      if(psramFound()){

        config.frame_size = FRAMESIZE_UXGA;

        config.jpeg_quality = 10;

        config.fb_count = 2;

      } else {

        config.frame_size = FRAMESIZE_SVGA;

        config.jpeg_quality = 12;

        config.fb_count = 1;

      }


    #if defined(CAMERA_MODEL_ESP_EYE)

      pinMode(13, INPUT_PULLUP);

      pinMode(14, INPUT_PULLUP);

    #endif


      // camera init

      esp_err_t err = esp_camera_init(&config);

      if (err != ESP_OK) {

        Serial.printf("Camera init failed with error 0x%x", err);

        return;

      }


      sensor_t * s = esp_camera_sensor_get();

      // initial sensors are flipped vertically and colors are a bit saturated

      if (s->id.PID == OV3660_PID) {

        s->set_vflip(s, 1); // flip it back

        s->set_brightness(s, 1); // up the brightness just a bit

        s->set_saturation(s, -2); // lower the saturation

      }

      // drop down frame size for higher initial frame rate

      s->set_framesize(s, FRAMESIZE_QVGA);


    #if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)

      s->set_vflip(s, 1);

      s->set_hmirror(s, 1);

    #endif


      WiFi.begin(ssid, password);


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

        delay(500);

        Serial.print(".");

      }

      Serial.println("");

      Serial.println("WiFi connected");


      startCameraServer();


      Serial.print("Camera Ready! Use 'http://");

      Serial.print(WiFi.localIP());

      Serial.println("' to connect");

    }


    void loop() {

      // put your main code here, to run repeatedly:

      delay(10000);

    }