實現控制多個發射遙控器訊號的初版
以WiFiManualWebServer範例當基底,融合紅外線發射
因為找不到比網頁更方便的範例來開發
畢竟UI部分,也很難找到比網頁更方便的方式
#include <ESP8266WiFi.h>
實現控制多個發射遙控器訊號的初版
以WiFiManualWebServer範例當基底,融合紅外線發射
因為找不到比網頁更方便的範例來開發
畢竟UI部分,也很難找到比網頁更方便的方式
#include <ESP8266WiFi.h>
void setup() {

目前功能,
連上WiFi後,用網頁控制Arduino發射紅外線,
WiFi無線控制有紅外線接收器的設備。
無線功能由WiFi傳輸,
所以需要一個WiFi基地台,
試驗時可用手機分享基地台熱點當作WiFi主機(基地台)。
Arduino連上WiFi後,
創建一個WiFiWebServer,
這WebServer可用網址後綴來接收控制。
主要 WiFiManualWebServer
接收 IRrecvDump
發射 IRremoteESP8266: IRsendDemo
------------------------
主要 WiFiManualWebServer
接收 IRrecvDump
發射 IRremoteESP8266: IRsendDemo
重點參考 :
Arduino-透過IRremote函式庫(Ver3.5.3)實現紅外線模組接收及發送Jan 25-2022
更新的IRremote库实例2023-1-23 https://www.arduino.cn/thread-342990-1-1.html
[接收]
#include <IRremote.hpp>
void setup()
{
Serial.begin(115200);
IrReceiver.begin(7, ENABLE_LED_FEEDBACK); // PIN7收IR
}
void loop() {
if (IrReceiver.decode()) {
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
IrReceiver.printIRResultShort(&Serial); // optional use new print version
IrReceiver.resume(); // Enable receiving of the next value
}
}
原出處用PIN3收IR,但我用7。
我收到的是
B04F3000
Protocol=NEC Address=0x3000 Command=0x4F Raw-Data=0xB04F3000 32 bits LSB first
[發射]
-----------
前期失敗過程
用ESP32系列的NodeMCU-32S,其實也不確定是不是真得是NodeMCU-32S
但IDE選NodeMCU-32S可以正常燒錄,沒有報錯說選錯板子型號
紅外線接收得到,但很怪,
每次收到的不一定一樣,而且也不會一直都能收到
常常五分鐘內只能收到十幾個次,
於是懷疑是接收器的問題,頻率28KHz沒有錯,
但可能有其他不一樣的地方,
但事後證明不是接收器的問題,
只能說既然換官方的 UNO Rev3 就馬上正常解決,
也就是ESP32雖然是相容,
但有太多可能的問題需要克服,
UNO也不貴,
如果單純開發簡單功能如本篇,只是要紅外線收發,
那還是先直接從較單純的Arduino官方版本開始會比較經濟。
以下是一個簡單的貪食蛇遊戲的 Python 代碼:
pythonimport pygame
import random
# 初始化 Pygame
pygame.init()
# 定義常數
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 600
SNAKE_SIZE = 10
SNAKE_SPEED = 15
SNAKE_COLOR = (0, 255, 0)
FOOD_COLOR = (255, 0, 0)
# 創建視窗
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 設置標題
pygame.display.set_caption('貪食蛇')
# 創建蛇
snake = [[200, 200], [210, 200], [220, 200]]
snake_direction = 'RIGHT'
# 創建食物
food_position = [random.randrange(1, (SCREEN_WIDTH//10)) * 10,
random.randrange(1, (SCREEN_HEIGHT//10)) * 10]
# 定義函數
def draw_snake(snake):
for pos in snake:
pygame.draw.rect(screen, SNAKE_COLOR, pygame.Rect(pos[0], pos[1], SNAKE_SIZE, SNAKE_SIZE))
def move_snake(snake, snake_direction):
if snake_direction == 'RIGHT':
new_pos = [snake[0][0] + SNAKE_SIZE, snake[0][1]]
elif snake_direction == 'LEFT':
new_pos = [snake[0][0] - SNAKE_SIZE, snake[0][1]]
elif snake_direction == 'UP':
new_pos = [snake[0][0], snake[0][1] - SNAKE_SIZE]
elif snake_direction == 'DOWN':
new_pos = [snake[0][0], snake[0][1] + SNAKE_SIZE]
snake.insert(0, new_pos)
snake.pop()
def draw_food(food_position):
pygame.draw.rect(screen, FOOD_COLOR, pygame.Rect(food_position[0],
food_position[1],
SNAKE_SIZE,
SNAKE_SIZE))
def check_collision(snake, food_position):
if snake[0] == food_position:
return True
return False
def check_game_over(snake):
if snake[0][0] < 0 or snake[0][0] > SCREEN_WIDTH-SNAKE_SIZE:
return True
elif snake[0][1] < 0 or snake[0][1] > SCREEN_HEIGHT-SNAKE_SIZE:
return True
for block in snake[1:]:
if snake[0] == block:
return True
return False
# 遊戲迴圈
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT and snake_direction != 'LEFT':
snake_direction = 'RIGHT'
elif event.key == pygame.K_LEFT and snake_direction != 'RIGHT':
snake_direction = 'LEFT'
elif event.key == pygame.K_UP and snake_direction != 'DOWN':
snake_direction = 'UP'
elif event.key == pygame.K_DOWN and snake_direction != 'UP':
snake_direction = 'DOWN'
screen.fill((0, 0, 0))
# 移動蛇
move_snake(snake, snake_direction)
import pygameimport random
# 初始化 Pygamepygame.init()
# 定義常數SCREEN_WIDTH = 600SCREEN_HEIGHT = 600SNAKE_SIZE = 10SNAKE_SPEED = 15SNAKE_COLOR = (0, 255, 0)FOOD_COLOR = (255, 0, 0)
# 創建視窗screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 設置標題pygame.display.set_caption('貪食蛇')
# 創建蛇snake = [[200, 200], [210, 200], [220, 200]]snake_direction = 'RIGHT'
# 創建食物food_position = [random.randrange(1, (SCREEN_WIDTH//10)) * 10, random.randrange(1, (SCREEN_HEIGHT//10)) * 10]
# 定義函數def draw_snake(snake): for pos in snake: pygame.draw.rect(screen, SNAKE_COLOR, pygame.Rect(pos[0], pos[1], SNAKE_SIZE, SNAKE_SIZE))
def move_snake(snake, snake_direction): if snake_direction == 'RIGHT': new_pos = [snake[0][0] + SNAKE_SIZE, snake[0][1]] elif snake_direction == 'LEFT': new_pos = [snake[0][0] - SNAKE_SIZE, snake[0][1]] elif snake_direction == 'UP': new_pos = [snake[0][0], snake[0][1] - SNAKE_SIZE] elif snake_direction == 'DOWN': new_pos = [snake[0][0], snake[0][1] + SNAKE_SIZE] snake.insert(0, new_pos) snake.pop()
def draw_food(food_position): pygame.draw.rect(screen, FOOD_COLOR, pygame.Rect(food_position[0], food_position[1], SNAKE_SIZE, SNAKE_SIZE))
def check_collision(snake, food_position): if snake[0] == food_position: return True return False
def check_game_over(snake): if snake[0][0] < 0 or snake[0][0] > SCREEN_WIDTH-SNAKE_SIZE: return True elif snake[0][1] < 0 or snake[0][1] > SCREEN_HEIGHT-SNAKE_SIZE: return True for block in snake[1:]: if snake[0] == block: return True return False
# 遊戲迴圈while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT and snake_direction != 'LEFT': snake_direction = 'RIGHT' elif event.key == pygame.K_LEFT and snake_direction != 'RIGHT': snake_direction = 'LEFT' elif event.key == pygame.K_UP and snake_direction != 'DOWN': snake_direction = 'UP' elif event.key == pygame.K_DOWN and snake_direction != 'UP': snake_direction = 'DOWN'
screen.fill((0, 0, 0))
# 移動蛇 move_snake(snake, snake_direction)