Select Git revision
vnc-testbild.tex
client.ino 4.66 KiB
#include <WiFi.h>
#include <Ticker.h>
#include <WiFiManager.h>
#define LED0 26
#define LED1 18
#define LED2 19
#define BUTTON 22
IPAddress server(192,168,4,1);
WiFiClient client;
WiFiManager wifiManager;
Ticker tickerPing;
Ticker tickerGame;
Ticker tickerToggle;
Ticker tickerEnd;
char stringBuffer[50];
int bufferLength = 0;
int buttonState = 0;
int lastButtonState = 0;
int gameBuffer = -1;
int gameCount = 0;
int id = -1;
unsigned long elapsedTime = 0;
unsigned long pressedTime = 0;
enum GameState {
IDLE, // Ruhezustand
GAME_1, // Spiel 1 Reaktionsspiel
GAME_2, // Spiel 2 Quiz
GAME_3, // Spiel 3, usw.
OPTION_MENU, // Optionen anzeigen
};
GameState gameState = IDLE;
// Ping an Server senden
void tickPing(){
client.println("<PING>");
}
// LED blinken lassen
void toggle(int led){
digitalWrite(led, !digitalRead(led));
}
void end(){
tickerToggle.detach();
}
// im Config-Mode LED blau blinken lassen
void configModeCallback (WiFiManager *myWiFiManager) {
tickerToggle.attach(0.2, toggle, LED1);
}
void setup(){
Serial.begin(115200);
pinMode(LED0, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(BUTTON, INPUT);
tickerToggle.attach(1.0, toggle, LED1);
//wifiManager.resetSettings();
wifiManager.setAPCallback(configModeCallback);
if (!wifiManager.autoConnect("AutoConnectAP")) {
Serial.println("failed to connect and hit timeout");
ESP.restart();
delay(1000);
}
Serial.println(WiFi.softAPIP());
Serial.println("!--- Connecting To " + wifiManager.getConfigPortalSSID() + " ---!");
tickerToggle.detach();
digitalWrite(LED1, LOW);
Serial.println("!-- Client Device Connected --!");
Serial.println("Connected To : " + String(WiFi.SSID()));
Serial.println("Signal Strenght : " + String(WiFi.RSSI()) + " dBm");
Serial.print ("Server IP Address : ");
Serial.println(server);
Serial.print ("Device IP Address : ");
Serial.println(WiFi.localIP());
client.stop();
if(client.connect(server, 9001)){
Serial.println ("<CONNECTED>");
client.println ("<CONNECTED>");
tickerPing.attach(1.0, tickPing);
}
}
void loop(){
if(WiFi.status() != WL_CONNECTED){
ESP.restart();
delay(1000);
}
buttonState = digitalRead(BUTTON);
if(lastButtonState == LOW && buttonState == HIGH){ // button gedrückt
pressedTime = millis();
if(gameState == GAME_1){
client.println("<PRESSED>");
}
}
else if(lastButtonState == HIGH && buttonState == LOW) { // button losgelassen
elapsedTime = millis() - pressedTime;
if(elapsedTime > 15000){ // neustarten
wifiManager.resetSettings();
ESP.restart();
delay(1000);
}
else if(elapsedTime >= 6000){ // id anzeigen
tickerToggle.attach(0.5, toggle, LED1);
tickerEnd.once(id, end);
}
else if(elapsedTime >= 4000 && gameState == GAME_2){ // Spiel 2 aktuelle Punktzahl
tickerToggle.attach(0.5, toggle, LED1);
tickerEnd.once(gameCount, end);
}
else if(elapsedTime >= 2000 && gameState == GAME_2){ // Spiel 2 Rücksetzen, wer zurücksetzt bekommt einen Punkt
gameCount++;
client.println("<OFF>");
}
else if(elapsedTime >= 50 && gameState == GAME_2){ // Spiel 2 spielen
client.println("<PRESSED>");
}
}
lastButtonState = buttonState;
if(client.available()){
char c = client.read();
if((int)c >= 32 && bufferLength < 50 - 1){
stringBuffer[bufferLength++] = c;
}
else if(c == '\n'&& bufferLength > 0){
stringBuffer[bufferLength] = '\0';
if(strstr(stringBuffer, "<GREEN>")){
digitalWrite(LED0, HIGH);
}else if(strstr(stringBuffer, "<BLUE>")){
digitalWrite(LED1, HIGH);
}else if(strstr(stringBuffer, "<ORANGE>")){
digitalWrite(LED2, HIGH);
}else if(strstr(stringBuffer, "<OFF>")){
digitalWrite(LED0, LOW);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
}else if (strstr(stringBuffer, "<ID_")) {
char *start = stringBuffer + 4;
char *end = strstr(stringBuffer, ">");
if (end != nullptr) {
*end = '\0';
id = atoi(start);
}
}else if (strstr(stringBuffer, "<GAME_")) {
char *start = stringBuffer + 6;
char *end = strstr(stringBuffer, ">");
if (end != nullptr) {
*end = '\0';
gameBuffer = atoi(start);
gameState = static_cast<GameState>(gameBuffer);
gameBuffer = -1;
}
}else if (strstr(stringBuffer, "<IDLE>")) {
digitalWrite(LED0, LOW);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
gameState = IDLE;
gameBuffer = -1;
}
bufferLength = 0;
}
}
}