2023年7月24日 星期一

Arduino WeMos R2 [入門] 兩個按鈕控制

參考
ESP8266作为arduino D1 wifi模块应用时引脚序号说明(与UNO对比异同)2.5.0版本开发板库



const int BUTTON_PIN1 = 16;  // 按鍵的接腳
const int BUTTON_PIN2 = 5;  // 按鍵的接腳

int buttonState1 = 0;   // 按鈕的狀態
int buttonState2 = 0;   // 按鈕的狀態

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON_PIN1, INPUT_PULLUP);
  pinMode(BUTTON_PIN2, INPUT_PULLUP); //設定按鈕的接腳為輸入,因為我們要讀取它的狀態
}

void loop() {
  buttonState1 = digitalRead(BUTTON_PIN1);  //讀取按鍵的狀態
  buttonState2 = digitalRead(BUTTON_PIN2);
  /*
  if(buttonState1 == LOW){          //如果按鍵按了
    Serial.println("16BUTTON");
  }
  if(buttonState2 == LOW){          //如果按鍵按了
    Serial.println("5BUTTON");
  }
  */
  if(buttonState1 == HIGH){          //如果按鍵按了
    Serial.println("16BUTTON");
  }
  if(buttonState2 == HIGH){          //如果按鍵按了
    Serial.println("5BUTTON");
  }
 
}

2023年7月23日 星期日

Arduino WeMos R2 遙控器複製拷貝自造 紅外線發射接收復刻 無線網頁控制

目前功能,

連上WiFi後,用網頁控制Arduino發射紅外線,

WiFi無線控制有紅外線接收器的設備。



無線功能由WiFi傳輸,

所以需要一個WiFi基地台,

試驗時可用手機分享基地台熱點當作WiFi主機(基地台)。


Arduino連上WiFi後,

創建一個WiFiWebServer,

這WebServer可用網址後綴來接收控制。


主要 WiFiManualWebServer

接收 IRrecvDump

發射 IRremoteESP8266: IRsendDemo

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

主要 WiFiManualWebServer

接收 IRrecvDump

發射 IRremoteESP8266: IRsendDemo











/*
    This sketch demonstrates how to set up a simple HTTP-like server.
    The server will set a GPIO pin depending on the request
      http://server_ip/gpio/0 will set the GPIO2 low,
      http://server_ip/gpio/1 will set the GPIO2 high
    server_ip is the IP address of the ESP8266 module, will be
    printed to Serial when the module is connected.
*/

#include <ESP8266WiFi.h>

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>

const uint16_t kIrLed = 4;  // ESP8266 GPIO pin to use. Recommended: 4 (D2).
IRsend irsend(kIrLed);  // Set the GPIO to be used to sending the message.

#ifndef STASSID
#define STASSID "你的WIFI SSID"
#define STAPSK "你的WIFI密碼"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
 

  irsend.begin();
#if ESP8266
  Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
#else  // ESP8266
  Serial.begin(115200, SERIAL_8N1);
#endif  // ESP8266


  // prepare LED
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }
  Serial.println();
  Serial.println(F("WiFi connected"));

  // Start the server
  server.begin();
  Serial.println(F("Server started"));

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.accept();
  if (!client) { return; }
  Serial.println(F("new client"));

  client.setTimeout(5000);  // default is 1000

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(F("request: "));
  Serial.println(req);

  // Match the request
  int val,IR;
  if (req.indexOf(F("/gpio/0")) != -1)
    {val = 0;}
  else if (req.indexOf(F("/gpio/1")) != -1)
    {val = 1;}
  else if (req.indexOf(F("/IRsend")) != -1)
    {IR = 0;
    Serial.println("NEC");
    irsend.sendNEC(0xCF20D);
    }
  else if (req.indexOf(F("/IRclose")) != -1)
    {IR = 1;}  
  else {
    Serial.println(F("invalid request"));
    val = digitalRead(LED_BUILTIN);
  }

  // Set LED according to the request
  digitalWrite(LED_BUILTIN, val);

  // read/ignore the rest of the request
  // do not client.flush(): it is for output only, see below
  while (client.available()) {
    // byte by byte is not very efficient
    client.read();
  }

  // Send the response to the client
  // it is OK for multiple small client.print/write,
  // because nagle algorithm will group them into one single packet
  client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now "));
  client.print((val) ? F("high") : F("low"));
  client.print(F("<br><br>Click <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/1'>here</a> to switch LED GPIO on, or <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/0'>here</a> to switch LED GPIO off.<a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/IRsend'>here</a> to send IR.</html>"));

  // The client will actually be *flushed* then disconnected
  // when the function returns and 'client' object is destroyed (out-of-scope)
  // flush = ensure written data are received by the other side
  Serial.println(F("Disconnecting from client"));
}

GOOGLE不小心按了改成韓文,改變語言設定

  好奇點了上面的其他語言版本,結果搞了一會才改回中文,提供修改流程給需要的人