• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie LED przyciskami
#1
Przede wszystkim witam wszystkich.
Niedawno wszedłem w świat Arduino i jego programowania ponieważ chciałem stworzyć sobie kontroler do pc i o ile samo projektowanie jego wyglądu oraz budowa nie sprawiają mi żadnej trudności o tyle na programowaniu trochę poległem. Mój problem polega na tym że za Chiny ludowe nigdzie nie mogę znaleźć informacji jak sprawić aby dioda LED podpięta pod Arduino świeciła po wciśnięciu przycisku. Jak to dokładnie miało by wyglądać:
Pod pin 12 oraz 11 mam podpięte przyciski
Pin 13 to dioda
Po naciśnięciu pinu 12 dioda się zapala i nie gaśnie po puszczeniu dopiero ponowne naciśnięcie ja gasi oraz może ją zgasić naciśnięcie pinu 11.
Czy mógł by mi ktoś podpowiedzieć jak to zaprogramować? Albo chociaż czego szukać?
Do przycisków wykorzystuje INPUT_PULLUP
Z góry dziękuję za podpowiedź

Wymyśliłem coś takiego do sterowania i o ile przycisk 12 diodę zapala i gasi idealnie a przycisk 11 tylko ja gasi. To w grze przycisk 11 działa równie idealnie a przycisk 12 nie bardzo. Diodą owszem steruje ale nie za każdym razem łapie w grz
Kod:
// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
//       Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------

#include <Joystick.h>

Joystick_ Joystick;

void setup() {
  // Initialize Button Pins
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  pinMode(13, OUTPUT);

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;

// Last state of the button
int lastButtonState[4] = {0,0,0,0};

boolean stan=0; //prawda lub fałsz
void loop() {

  // Read pin values
  for (int index = 0; index < 4; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);

//Moje dodatki
if(digitalRead(12) == LOW)//Odczytanie stanu przycisku
  {
    delay(20);
    stan=!stan;//Odwrotnosc stanu 0->1 badz 1->0
    digitalWrite(13,stan);
    while(digitalRead(12) == LOW);
    delay(20);
  }
  if(digitalRead(11) == LOW)//Odczytanie stanu przycisku
  {
    delay(20);
    stan=0;//Zmienia stan na 0
    digitalWrite(13,stan);
    while(digitalRead(12) == LOW);
    delay(20);
}
}
 
Odpowiedź
#2
To że w ogóle coś Ci działa zgodnie z oczekiwaniami to sukces. Wywal delay, a ten while może blokować jeszcze bardziej program doprowadzając do czkawki, naucz się używać millis. Stan wszystkich przycisków masz zapisany w tablicy lastButtonState, możesz ich po prostu użyć w swoim bloku.
Nie odrobiłeś wszystkich lekcji programowania (z niezbędnego MINIMUM), za szybko na pisanie programu, który miałby robić coś użytecznego.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Lekcje już trochę nadrobione, kod wygląda już inaczej. Lecz pytanie do was czy należało by coś jeszcze poprawić?
Kod:
#include <PCF8574.h>
#include <Arduino.h>
#include <Wire.h>
#include <Joystick.h>

PCF8574 pcf8574(0x20);



Joystick_ Joystick;
//Definicje pinów do których podłączam ledy

const int dioda1 = P0; //Pauza Czas
const int przycisk1 = 1; //Pauza Czas
int stan_dioda1 = HIGH;
int stan_przycisk1;
int ostatni_stan_przycisk1 = HIGH;
long lastDebounceTime = 0; // Zmienna potrzebna do przechowynia mierzeonego w milisekundach czasu 
long czas_drgania = 100;    // Czas na drganie styków
void setup() {

 
  // Ledy
    pcf8574.pinMode(dioda1, OUTPUT);
  pcf8574.digitalWrite(dioda1, stan_dioda1);
  pinMode(przycisk1, INPUT_PULLUP);
pcf8574.begin();
 

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 1;

// Last state of the button
int lastButtonState[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0};


void loop() {

// Read pin values
  for (int index = 0; index < 4; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);

//Pauza - przycisk1, dioda1
  int odczyt1 = digitalRead(przycisk1); //Odczyt stanu przycisku do zmiennej lokalnej

// W tym miejscu rozpoczyna się procedura chroniąca nasz układ przed drganiem styków
//Jeśli aktualnie odczytany stan przycisku jest różny od zmiennej ostatni_stan_przycisku
//Uruchamia się funkcja millis() odliczająca milisekundy
  if (odczyt1 != ostatni_stan_przycisk1) {
    lastDebounceTime = millis();
  }
//Jeśli ostatni czas zmiany stanu przycisku był większa od zmiennej czas_drgania
  if ((millis() - lastDebounceTime) > czas_drgania) {
//Jeśli aktualnie odczytany stan przycisku jest nadal różny od zminnej stan_przycisku, przypisuje odczytaną wartość do stan_przycisku
    if (odczyt1 != stan_przycisk1) {
      stan_przycisk1 = odczyt1;

      if (stan_przycisk1 == LOW) { // Jeśli przycisk jest wciśniety (stan wysoki)
        stan_dioda1 = !stan_dioda1;//Wyłączenie diody (negacja zmiennej stan_diody przechowującej wartość HiGH)
       }
    }
  }

pcf8574.digitalWrite(dioda1, stan_dioda1); //Ustawienie bierzącego stanu diody na pinie wyjściowym (stan wysoki, lub niski)

  ostatni_stan_przycisk1 = odczyt1; //Zapisanie ostatniego stanu przycisku
}
}
Średnio jest to póki co opisane, po za tym jest też tylko dla jednego przycisku ale to tylko do testów więc póki co tyle wystarczy
 
Odpowiedź
#4
Jak potrzebujesz robić delay(50) to znaczy, że nie chcesz robić coś częściej niż 50ms, zamiast wstawiać delay używasz funkcji millis() , odczytujesz aktualny stan tego licznika, zapisujesz jego stan, robisz coś i w każdym obiegu pętli sprawdzasz czy licznik zmienił się o co najmniej 50, jeśli tak to oznacza, że minęło 50ms, zapisujesz nowy aktualny stan z millis(), wykonujesz zadanie i znowu zaczynasz sprawdzać czy minęło kolejne 50ms.
Różnica jest taka, że pozostała część programu działa bez czkawki, dodanie kolejnego bloku programu napisanego w podobny sposób nie będzie wypływało na inne bloki programu - w przybliżeniu, w końcu nagromadzenie poleceń i funkcji spowoduje jakieś spowolnienie działania.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości