#define BLYNK_TEMPLATE_ID "TMPL3CFIMnuf4"
#define BLYNK_TEMPLATE_NAME "iotproj3"
#include "Arduino.h"
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include "key.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define VOLTAGEPIN 34
#define WARNINGLED 16
#define GODSWITCH KEY_PIN_1 //PIN32
#define GODPIN KEY_PIN_2 //PIN33
#define NONUSE KEY_PIN_2 //PIN25
#define RELAYPIN KEY_PIN_4 //PIN13
#define KEYNUM 4
unsigned char keyState[KEYNUM] ;
static void Task_KeyScan(void *pvParameters);
static void Game_Ctrl(void *pvParameters);
const float voltageConversionFactor = 3.3 / 4095.0;
bool LaserDct(unsigned char key_pin, float delayTime) ;
bool gameOverFlag = false;
void init_task()
{
Serial.begin(115200);
Serial.print("init_task\n");
Serial.print("--laser detect--\n");
xTaskCreate(
Task_KeyScan, // 任务函数
"TaskButton", // 任务名
1024 * 2, // 任务栈
NULL, // 任务参数
0, // 任务优先级, with 3 (configMAX_PRIORITIES - 1) 是最高的,0是最低的.
NULL // 任务句柄
);
xTaskCreate(
Game_Ctrl, // 任务函数
"GamenControl", // 任务名
1024 * 20, // 任务栈
NULL, // 任务参数
0, // 任务优先级, with 3 (configMAX_PRIORITIES - 1) 是最高的,0是最低的.
NULL // 任务句柄
);
}
void ssd1306_Init() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (1);
}
display.display();
vTaskDelay(2000);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("RD");
display.display();
vTaskDelay(2000);
//randomSeed(analogRead(A0));
}
void setup() {
pinMode(WARNINGLED, OUTPUT);
digitalWrite(WARNINGLED, LOW);
ssd1306_Init();
init_task();
keyInit();
Serial.println(F("init finish"));
}
void loop() {
}
static void Game_Ctrl(void *pvParameters) {
float laserDelayTime ;
while (1)
{
laserDelayTime = analogRead(VOLTAGEPIN) * voltageConversionFactor * 3;
display.clearDisplay();
display.setCursor(0, 0);
Serial.println(laserDelayTime);
display.print(laserDelayTime);
display.display();
switch (keyState[1]) {
case KEY_HOLD:
// println("god mode");
GODPIN == KEY_HOLD ? gameOverFlag = 1 : gameOverFlag = 0 ;
break;
default:
if((LaserDct(RELAYPIN,laserDelayTime) == 1)){
printf("gameover");
}
}
vTaskDelay(100);
}
}
static void Task_KeyScan(void *pvParameters)
{
while (1)
{
switch ( KeyScan(KEY_PIN_1))
{
case KEY_ON:
keyState[0] = KEY_ON;
break;
case KEY_OFF:
keyState[0] = KEY_OFF;
break;
case KEY_HOLD:
keyState[0] = KEY_HOLD;
break;
case KEY_ERROR:
keyState[0] = KEY_ERROR;
break;
default:
break;
}
switch (KeyScan(KEY_PIN_2))
{
case KEY_ON:
keyState[1] = KEY_ON;
break;
case KEY_OFF:
keyState[1] = KEY_OFF;
break;
case KEY_HOLD:
keyState[1] = KEY_HOLD;
break;
case KEY_ERROR:
keyState[1] = KEY_ERROR;
break;
default:
break;
}
switch (KeyScan(KEY_PIN_3))
{
case KEY_ON:
keyState[2] = KEY_ON;
break;
case KEY_OFF:
keyState[2] = KEY_OFF;
break;
case KEY_HOLD:
keyState[2] = KEY_HOLD;
break;
case KEY_ERROR:
keyState[2] = KEY_ERROR;
break;
default:
break;
}
switch (KeyScan(KEY_PIN_4))
{
case KEY_ON:
keyState[3] = KEY_ON;
break;
case KEY_OFF:
keyState[3] = KEY_OFF;
break;
case KEY_HOLD:
keyState[3] = KEY_HOLD;
break;
case KEY_ERROR:
keyState[3] = KEY_ERROR;
break;
default:
break;
}
vTaskDelay(5);
}
}
bool switchState = KEY_RELEASE;
bool lastState = KEY_RELEASE;
unsigned long lastDebounce;
bool LaserDct(unsigned char key_pin, float delayTime) {
int readValue = digitalRead(key_pin);
if (readValue != lastState) {
lastDebounce = millis();
}
if ((millis() - lastDebounce ) > delayTime * 1000) {
if (readValue != switchState) {
switchState = readValue;
if (switchState == KEY_PRESS) {
gameOverFlag = 1;
return true;
}
}
}
lastState = readValue;
return false ;
}