• 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
Jeden port obsługiwany z dwóch innych
#1
Panowie i Panie, proszę o pomoc z kodem programu bo już nie wiem co źle robię. 
Dysponuję płytką arduino yun + ekspander PCF8574, komunikacja IC2 - tu wszystko działa ok. 
i teraz tak: 
Mam podpiętego leda pod wyjście ekspandera. Napisałem kod do zaplalnia tego leda przy użyciu przycisku zwierającego do masy w taki sposób że jak nacisnę raz to zapalam leda, a jak nacisnę drugi raz to go gaszę i tu wszyto również działa bez problemu. Chciałem jednak dodać do tego coś takiego że po pojawieniu się stanu HIGH na wejściu nr 13 Led się zapala, a po zniknięciu tego stanu gasi. i napisałem drugi kod niestety coś chyba schrzaniłem bo po podaniu HIGH na 13 led się zapala ale po zniknięciu HIGH z 13 nie gaśnie. Rzucie okiem czy coś robię nie tak. z góry dzięki:

Kod pierwszy bez obsługi portu 13, który działa: 
Kod:
reading = expander3.digitalRead(4);

  if (reading == LOW && previous == HIGH && millis() - time > debounce) 
  {
     if (state == LOW)
      state = HIGH;
    else
      state = LOW;

    time = millis();    
  }

  
   expander1.digitalWrite(0, state);
    previous = reading;

drugi kod: 
Kod:
reading = expander3.digitalRead(4);

  if (digitalRead(13) == HIGH || reading == LOW && previous == HIGH && millis() - time > debounce) 
  {
     if (state == LOW || digitalRead(13) == HIGH)
      state = HIGH;
    else
      state = LOW;

    time = millis();    
  }

  
   expander1.digitalWrite(0, state);
    previous = reading;
[/code]
 
Odpowiedź
#2
Ten drugi kod nie ma sensu.
Z jednej strony zapalasz i gasisz przyciskiem z ekspandera, a jednocześnie chcesz, gdy jest HIGH na 13 było zapalone, a jak LOW to zgaszone?
Musisz się zastanowić, czy chcesz sterować diodą przyciskiem z ekspandera, czy z pinu 13.
Dla mnie nie ma tu żadnej logiki, ale na upartego, możesz zrobić tak, że gdy wciskasz przycisk w ekspanderze, to wyłączasz sterowanie diodą z pinu 13, a gdy zmieniasz stan pinu, to wyłączasz testowanie stanu na ekspanderze.
Mi by było łatwiej zrobić to w obiektówce, było by przejrzyście.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
chodzi o to że zapalanie leda przez ekspander to fizyczny przycisk, a stan wysoki na porcie 13 będę uzyskiwał z internetu
 
Odpowiedź
#4
(09-04-2018, 19:56)omnixcrs napisał(a): chodzi o to że zapalanie leda przez ekspander to fizyczny przycisk, a stan wysoki na porcie 13 będę uzyskiwał z internetu

Z punktu widzenia diody, nie ma znaczenia w jaki sposób realizowana jest dostawa prądu.
Mamy interfejs w postaci dwóch przycisków, jeden fizyczny, drugi sieciowy.
Programista powinien zastanowić się nad implementacją.

Mi przychodzą do głowy trzy rozwiązania.

1) Operator AND
[Obrazek: sEt5SrE.png]

2) Operator OR
[Obrazek: W6HXfTK.png]

3) A tu mamy negację NOT
[Obrazek: YbS23HO.png]

W Twoim przypadku to raczej chodzi o przykład trzeci?
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
Witam
Jeśli podasz HIGH na 13 to wchodzi do tego ifa:
Kod:
if (digitalRead(13) == HIGH || reading == LOW && previous == HIGH && millis() - time > debounce)
 {
    if (state == LOW || digitalRead(13) == HIGH)
     state = HIGH;
   else
     state = LOW;

   time = millis();    
 }
i ustawia state na 1. Jeśli jednak zmienisz stan 13 z 1 na 0 to już w ogóle tu nie zagląda i warunek else state=LOW; nigdy się nie wykona. Może tak zobacz:
 
Kod:
if (digitalRead(13) == HIGH || reading == LOW && previous == HIGH && millis() - time > debounce)
 {
    if (state == LOW || digitalRead(13) == HIGH)
     state = HIGH;

    sterowaniez13=1;
   time = millis();    
 }

if(sterowaniez13||digitalRead(13) == LOW)
{
sterowaniez13=0; //dodaj ją jako globalną zmienną/flagę w szkicu lub static w loop
state = LOW; //było sterowanie z pinu 13, ale zostało zmienione na 0 to zmien state na 0

  expander1.digitalWrite(0, state);
   previous = reading;
 
Odpowiedź
#6
(09-04-2018, 19:56)omnixcrs napisał(a): chodzi o to że zapalanie leda przez ekspander to fizyczny przycisk, a stan wysoki na porcie 13 będę uzyskiwał z internetu

Zrób przycisk chwilowy. Naciśnięcie przycisku (opadające zbocze) zmieni stan leda na przeciwny. Zmiana stanu z internetu z niskiego na wysoki włączy diodę, z wysokiego na niski zgasi.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0  , Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP, BASIC C-64

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości