• 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
Instrukcja przeskoku
#1
Witam wszystkich, zaczynam przygodę z Arduino i zacząłem od stworzenia prostego układu z dwoma diodami LED i dwoma przyciskami. Obecnie szukam instrukcji która mógłbym wykorzystać do przeskoku do innej części programu. Mianowicie chodzi mi o to że jak świeci LED1 i chcę włączyć LED2 to program powinien na to nie zareagować tylko przeskoczyć do dalszej części programu. Czyli coś takiego

if (ledPin2 == HIGH) {
to przeskocz do "123"
 
Odpowiedź
#2
Naucz się  wielozadaniowość. Podziel funkcje.

np..

void dioda1(){

// program obsługujący diode 1

}

void diada2(){

//program obslugujący diode 2
}

void przyciski(){

// program obsługujący włączniki

  if(przycisk1=high){
  dioda1();
  }

  if(przycisk2==high){
  dioda2();
}

}

viod loop(){

przyciski();

}



Wtedy w każdej pozycji będziesz mógł skoczyć do dowolnej funkcji..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Witam

spróbowałem tak zrobić i przechodzi mi kompilację poprawnie się kompiluje lecz nie działa. Oto fragment kodu, proszę o podpowiedz co robię źle?

"
void loop() {
buttonState1 = digitalRead(buttonPin1);

buttonState2 = digitalRead(buttonPin2);

}

void LED1a(){


if (ledPin1 == HIGH){
   

LED1b();
 
}

 
if (buttonState1 == HIGH) {
   
digitalWrite(ledPin1, LOW);

} else
{

digitalWrite(ledPin1, HIGH);

}

}
void LED1b()
{
 
if (buttonState2 == HIGH) {
   
digitalWrite(ledPin2, LOW);

}
else {
    digitalWrite(ledPin2, HIGH);
 
}

}
 
Odpowiedź
#4
W loop masz wywołane do wykonania funkcje standardowe, a tych swoich nigdzie nie używasz, może w tym jest problem.
Czyli gdzieś tu powinno być wywołanie tych funkcji, np.:
void loop() {
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
LED1a();
}
I tak samo każda inna funkcja, albo wrzucasz ją do wykonania w SETUP, albo w LOOP, albo w inną funkcję, która jest wykonywana w tych sekcjach. Może też być wywołanie przerwaniem. Natomiast czy twoje funkcje mają jakikolwiek sens też nie wiadomo, program jest nierozłącznie związany ze schematem, którego tu nie pokazujesz. Stan niski na buttonPin może oznaczać wciśnięcie, albo jego brak, zależy co i jak się podłączy, jakie Arduino, jak się ustawi w setup uC. Stan niski na LED może oznaczać brak świecenia lub świecenie, zależy jak jest podłączony LED.
Kolejna sprawa, to szybkość działania, 16MHz oznacza, że uC wykonuje czynności w tempie 16mln/s. Czyli możesz nie zauważyć, że coś zostało włączone na 1us, a wciśnięty przycisk generuje tysiące niskich i wysokich stanów. Eliminuje się to odpowiednio programowo lub znowu schemat i jak masz do wszystko podłączone sprzętowo. Bez tego coś będzie działać, ale raczej nie tak jak się oczekuje.
 
Odpowiedź
#5
Wcześniej wstawiłem tylko część kodu, aby skupić się tylko na istotnej części. Oto cały kod:

const int buttonPin1 = 2;   

const int buttonPin2 = 3;

const int ledPin1 =  13;

const int ledPin2 = 12;



int buttonState1 = 0;       

int buttonState2 = 0;




void setup() {

 
pinMode(13, OUTPUT);

digitalWrite(13, LOW);

pinMode(12, OUTPUT);

digitalWrite(12, LOW);

pinMode(buttonPin1, INPUT_PULLUP);

pinMode(buttonPin2, INPUT_PULLUP);

}


void loop() {
buttonState1 = digitalRead(buttonPin1);

buttonState2 = digitalRead(buttonPin2);

}

void LED1a(){


if (ledPin1 == HIGH){
   

LED1b();
 
}

 
if (buttonState1 == HIGH) {
   
digitalWrite(ledPin1, LOW);

} else
{

digitalWrite(ledPin1, HIGH);

}

}
void LED1b()
{
 
if (buttonState2 == HIGH) {
   
digitalWrite(ledPin2, LOW);

}
else {
    digitalWrite(ledPin2, HIGH);
 
}

}


Wszystko działało tak jak należy do czasu wstawienia instrukcji VOID LED...
Chodzi mi o to że jak wciskam P1 to w czasie trzymania przycisku P1 świeci mi dioda LED1 i tak samo odnośnie drugiego przycisku i LED2.

Tą nową instrukcją chcę sprawić aby jak się świeci LED1 to LED2 się nie zapali i na odwrót.
 
Odpowiedź
#6
Nie zrozumiałeś mnie nadal popełniasz błędy dlatego nie działa bo nie rozumiesz tego .

Kod:
viod loop(){

tort() // zrób tort odwołaj się do tej funkcji
ciastko() // zrób ciastko odwołaj się do funkcji ciastka

}

viod tort(){
  //przepis na totra
}
viod ciastko(){

// a dupa zrób mi torta
tort();
return;      // opuści po zrobieniu torta nie wykona ciastka

// przepis na ciastko
}


A w twoim przypadku powinno być tak mniej więcej

Kod:
const int buttonPin1 = 2;   

const int buttonPin2 = 3;

const int ledPin1 =  13;

const int ledPin2 = 12;




void setup() {


pinMode(13, OUTPUT);

digitalWrite(13, LOW);

pinMode(12, OUTPUT);

digitalWrite(12, LOW);

pinMode(buttonPin1, INPUT_PULLUP);

pinMode(buttonPin2, INPUT_PULLUP);

}


void loop() {
LED1a(digitalRead(buttonPin1));

LED1b(digitalRead(buttonPin2));

}


void LED1a(int buttonState1){


if (ledPin2 == HIGH){

return;
}

if (buttonState1 == HIGH) {
   
digitalWrite(ledPin1, LOW);

} else
{

digitalWrite(ledPin1, HIGH);

}

}
void LED1b(int buttonState2)
{

if (ledPin1 == HIGH){
return;
}

if (buttonState2 == HIGH) {
   
digitalWrite(ledPin2, LOW);

}
else {
    digitalWrite(ledPin2, HIGH);

}

}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
Rozwiązałem problem w inny sposób, myślę że sposób jest bardziej praktyczny. Proszę o podpowiedz co robię źle gdyż program nie kompiluje się.
Przy jego pisaniu korzystałem z:
Kurs Arduino #6: Przyciski - Prawidłowe podłączenie i obsługa - YouTube

 
Kod:
const int buttonPin1 = 2;
const int buttonPin2 = 3;
const int ledPin1 = 12;
const int ledPin2 = 13;
bool state1 = 0;

int buttonState1 = 0;
int buttonState2 = 0;
int delayTime = 20;


void setup() {

  pinMode(12, OUTPUT);
  digitalWrite(12, LOW);
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  pinMode (buttonPin1, INPUT_PULLUP);
  pinMode (buttonPin2, INPUT_PULLUP);
}

void loop() {

  if (isButtonPresed(buttonPin1)&&(ledPin2 == LOW)) {            // jak przycisk-1 został wciśnięty i LED2 nie świeci to zapal LED1
  digitalWrite(ledPin1 == HIGH);
  }
  if (isButtonPresed(buttonPin1)||(isButtonPresed(buttonPin2))) {    // jeżeli został wciśnięty przycisk-1 lub przycisk-2 to zgaś LED1 i LED2
  digitalWrite(ledPin1 == LOW);
  digitalWrite(ledPin2 == LOW);
     }
   
  if (isButtonPresed(buttonPin2)&&(ledPin1 == LOW)) {            // jak przycisk-2 został wciśnięty i LED1 nie świeci to zapal LED2
  digitalWrite(ledPin2 == HIGH);
  }
  if (isButtonPresed(buttonPin1)||(isButtonPresed(buttonPin2))) {    // jeżeli został wciśnięty przycisk-1 lub przycisk-2 to zgaś LED1 i LED2
  digitalWrite(ledPin1 == LOW);
  digitalWrite(ledPin2 == LOW);
     }

bool isButtonPresed (int button) {                         // likwidacja drgania styków dla wszystkich przycisków
  if ((digitalRead(button) == LOW) {
  delay(delayTime);
  if (digitalRead(button) == LOW) {
  return true;
    }
   }
return false
}
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości