OpenAI

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

OpenAI

Příspěvek od kiRRow » 04 led 2023, 15:10

Zdravím. Asi pro některé nic nového, já to "objevil" včera : https://chat.openai.com/ .

Když jsem po tom chtěl tohle : "Vytvoř program pro arduino. Třída jménem tlacitko. Třída obsahuje metodu getStatus. Tato metoda obsahuje debounce tlačítka pomocí millis()."

Tak mi to odpovědělo tohle :
Zde je příklad programu pro Arduino, který obsahuje třídu "tlacitko" s metodou "getStatus". Tato metoda obsahuje debounce tlačítka pomocí funkce millis():

Kód: Vybrat vše

#define BUTTON_PIN 3
#define DEBOUNCE_DELAY 50 // ms

class Tlacitko {
  public:
    Tlacitko() {
      pinMode(BUTTON_PIN, INPUT_PULLUP);
    }
    bool getStatus() {
      // Debounce tlačítka pomocí millis()
      static unsigned long lastDebounceTime = 0;
      static bool lastButtonState = HIGH;
      bool buttonState = digitalRead(BUTTON_PIN);
      if (buttonState != lastButtonState) {
        lastDebounceTime = millis();
      }
      if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
        lastButtonState = buttonState;
      }
      return lastButtonState;
    }
};

Tlacitko tlacitko;

void setup() {
  // Inicializace
}

void loop() {
  if (tlacitko.getStatus() == LOW) {
    // Tlačítko bylo stisknuto
  } else {
    // Tlačítko není stisknuto
  }
}
:lol:
PS: neumí to někdo testnout ? já nemám zrovna na čem :/

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: OpenAI

Příspěvek od AstroMiK » 04 led 2023, 22:34

Nefunguje.


Po následující úpravě ale už ano:

Kód: Vybrat vše

#define BUTTON_PIN 3
#define DEBOUNCE_DELAY 1000 // ms                                       // změna na sekundu - jen aby to bylo v terminálu vidět

class Tlacitko {
  public:
    Tlacitko() {
      pinMode(BUTTON_PIN, INPUT_PULLUP);
    }
    bool getStatus() {
      // Debounce tlačítka pomocí millis()
      static unsigned long lastDebounceTime = 0;
      static bool lastButtonState = HIGH;
      bool buttonState = digitalRead(BUTTON_PIN);
      if (buttonState != lastButtonState) {
        lastDebounceTime = millis();
      }
      if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
        lastButtonState = !buttonState;                                 //   ***** TADY *****
      }
      return !lastButtonState;                                          //   ***** TADY *****
    }
};

Tlacitko tlacitko;

void setup() {
  Serial.begin(9600);
  // Inicializace
}

void loop() {
  if (tlacitko.getStatus() == LOW) {
Serial.println("Sepnuto");
  } else {
Serial.println("Rozepnuto");
  }
}


Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: OpenAI

Příspěvek od kiRRow » 05 led 2023, 15:07

To mi teda vysvětli :) jen jsi negoval a pak znovu negoval ...

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: OpenAI

Příspěvek od AstroMiK » 05 led 2023, 20:31

Zajímavý že jo?

Popravdě, když to nefungovalo na první pokus (výstup byl pořád stejný nezávisle na stisku tlačítka), tak jsem tam přidal nějaké debugovací printy.
Z nich jsem usoudil, že je nutné do 'lastButtonState' ukládat negativní hodnotu vstupního pinu, aby se vůbec ten výstup měnil.
Pak to začalo "něco" dělat. Jenže výstup byl opačný než jsem očekával (stisknuté tlačítko vracelo true a uvolněné false) - a proto to druhé překlopení.


Když jsem si to ale dneska prošel pořádně, tak koukám, že to je vlastně všechno úplně špatně.
Změna stavu nenastane okamžitě při stisku nebo uvolnění tlačítka, ale až po té nastavené době.

Tak tady vkládám třetí verzi, která už je snad "čitelná" a doufám, že už opravdu funkční.

Kód: Vybrat vše

#define BUTTON_PIN 3
#define DEBOUNCE_DELAY 1000 // ms                                       // změna na sekundu - jen aby to bylo v terminálu vidět



class Tlacitko
  {
    public:
    Tlacitko()
        {
          pinMode(BUTTON_PIN, INPUT_PULLUP);
        }
      
    bool getStatus()
      {
        static unsigned long lastDebounceTime = 0;
        static bool lastButtonState = HIGH;
        
        bool buttonState = digitalRead(BUTTON_PIN);
        
        if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY)
          {
            if (buttonState != lastButtonState)                 
              { 
                lastDebounceTime = millis();
                lastButtonState = buttonState;
              }
          }        
        return lastButtonState;
      }
  };

Tlacitko tlacitko;

void setup()
  {
    Serial.begin(9600);
  }

void loop()
  {
    Serial.println(tlacitko.getStatus());
  } 

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 15 hostů