Skip to content
Snippets Groups Projects
Select Git revision
  • 2022ss
  • 2024ss default
  • 2023ss
  • 2021ss protected
4 results

rtech-20220315-fig23.tex

Blame
  • 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;
        }
      }
    }