• 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
Led i ekspander PCF8574
#2
Nie załączaj plików, tylko wklej kod, bo ludzie nie mają czasu na pobieranie i kombinowanie z tymi plikami.

Kod:
#include <PCF8574.h>
#include <Wire.h>
#include <IRremote.h>  //biblioteka
#define irPin 8 //pin Arduino, do którego został podłšczony odbiornik IR
#define LED1 2

IRrecv irrecv(irPin);
decode_results results;

PCF8574 expander0;
PCF8574 expander1;
PCF8574 expander2;

void setup() {

 Serial.begin(9600);
 irrecv.enableIRIn(); // uruchamia odbiornik podczerwieni
 
pinMode(LED1,OUTPUT);
expander0.begin(0x20);
expander0.pinMode(0,OUTPUT);
expander0.pinMode(1,OUTPUT);
expander0.pinMode(2,OUTPUT);
expander0.pinMode(3,OUTPUT);
expander0.pinMode(4,OUTPUT);
expander0.pinMode(5,OUTPUT);
expander0.pinMode(6,OUTPUT);
expander0.pinMode(7,OUTPUT);
 
expander1.begin(0x21);
expander1.pinMode(0,OUTPUT);
expander1.pinMode(1,OUTPUT);
expander1.pinMode(2,OUTPUT);
expander1.pinMode(3,OUTPUT);
expander1.pinMode(4,OUTPUT);
expander1.pinMode(5,OUTPUT);
expander1.pinMode(6,OUTPUT);
expander1.pinMode(7,OUTPUT);

expander2.begin(0x22);
expander2.pinMode(0,OUTPUT);
expander2.pinMode(1,OUTPUT);
expander2.pinMode(2,OUTPUT);
expander2.pinMode(3,OUTPUT);
expander2.pinMode(4,OUTPUT);
expander2.pinMode(5,OUTPUT);
expander2.pinMode(6,OUTPUT);
expander2.pinMode(7,OUTPUT);
}

void loop() {
 // 1 program
   digitalWrite(LED1,HIGH);
 expander0.set();
 expander1.set();
 expander2.set();
   if (irrecv.decode(&results)) {
     
   if(results.value==0x9716BE3F)
     {
     
    digitalWrite(LED1,LOW);
    delay(50);
 digitalWrite(LED1,HIGH);
delay(50);
 expander0.digitalWrite(0, LOW);
 delay(50);
 expander0.digitalWrite(0, HIGH);
 delay(50);
 expander0.digitalWrite(1, LOW);
 delay(50);
 expander0.digitalWrite(1, HIGH);
 delay(50);
 expander0.digitalWrite(2, LOW);
 delay(50);
 expander0.digitalWrite(2, HIGH);

     }
     irrecv.resume();
 //program2

  if(results.value==0x3D9AE3F7)
  {
 digitalWrite(LED1,LOW);
 delay (50);
 digitalWrite(LED1,HIGH);
 delay(50);
 expander2.digitalWrite(7, LOW);
 delay(50);
 expander2.digitalWrite(7, HIGH);
 delay(50);
 expander2.digitalWrite(6, LOW);
 delay(50);
 expander2.digitalWrite(6, HIGH);
 delay(50);
 expander2.digitalWrite(5, LOW);
 delay(50);
 expander2.digitalWrite(5, HIGH);
 delay(50);
 expander2.digitalWrite(4, LOW);
 delay(50);
 expander2.digitalWrite(4, HIGH);
 delay(50);

  }
irrecv.resume();
 

}


Funkcja loop nie jest zakończona klamrą, więc ci się program nie skompiluje, ale to pewnie przeoczenie przy kopiowaniu do pliku tekstowego (tak jak by nie można było wrzucić pliku .ino).
Gdyby ludzie komentowali swoje "dzieła", to nie mieli by problemu z analizą błędów.
Po prostu piszesz przy każdej linijce kodu, co on ma zrobić i wiesz co się dzieje, że nic się nie dzieje.

Na przykład:


Kod:
if (irrecv.decode(&results)) {

Oznacza to, że jeśli mój odbiornik otrzyma coś z nadajnika....

i tym czymś będzie to:
Kod:
if(results.value==0x9716BE3F)

to wykonaj coś tam i przejdź do następnej instrukcji.
Jeśli nie jest tym co wyżej, to nie wykonuj kodu w klamrach, tylko przejdź po prostu do następnej instrukcji.

Następną instrukcją jest:
Kod:
irrecv.resume();

Ni mniej ni więcej, tylko resetuje odbiornik i przygotowuje go do odbioru następnej dawki danych.
Oznacza to, że results.value==0x00000000 i dalsza część kodu ci się nie wykona, ponieważ:
Kod:
if(results.value==0x3D9AE3F7)
nie jest prawdą, więc przechodzimy do następnej instrukcji:
(No i tu powinno być else if, nie będę tłumaczył, zajżyj do poradników)

Kod:
irrecv.resume();
czyli patrz wyżej.

Następnie pętla główna wykona się jeszcze raz.
Kod:
   digitalWrite(LED1,HIGH);
 expander0.set();
 expander1.set();
 expander2.set();
expanderX.set(); wyłącza wszystkie diody, więc jeśli coś wcześniej zadziałało, to pewnie nawet nie zdążyłeś zauważyć.

Ja bym wywalił
Kod:
 expander0.set();
 expander1.set();
 expander2.set();

do funkcji setup();
a tą funkcję:
Kod:
irrecv.resume();

wywalić i zostawić tylko po ostatnim ifie.
Coś w tym stylu:
Kod:
#include <PCF8574.h>
#include <Wire.h>
#include <IRremote.h>  //biblioteka
#define irPin 8 //pin Arduino, do którego został podłšczony odbiornik IR
#define LED1 2

IRrecv irrecv(irPin);
decode_results results;

PCF8574 expander0;
PCF8574 expander1;
PCF8574 expander2;

void setup() {

 Serial.begin(9600);
 irrecv.enableIRIn(); // uruchamia odbiornik podczerwieni
 
pinMode(LED1,OUTPUT);
expander0.begin(0x20);
expander0.pinMode(0,OUTPUT);
expander0.pinMode(1,OUTPUT);
expander0.pinMode(2,OUTPUT);
expander0.pinMode(3,OUTPUT);
expander0.pinMode(4,OUTPUT);
expander0.pinMode(5,OUTPUT);
expander0.pinMode(6,OUTPUT);
expander0.pinMode(7,OUTPUT);
 
expander1.begin(0x21);
expander1.pinMode(0,OUTPUT);
expander1.pinMode(1,OUTPUT);
expander1.pinMode(2,OUTPUT);
expander1.pinMode(3,OUTPUT);
expander1.pinMode(4,OUTPUT);
expander1.pinMode(5,OUTPUT);
expander1.pinMode(6,OUTPUT);
expander1.pinMode(7,OUTPUT);

expander2.begin(0x22);
expander2.pinMode(0,OUTPUT);
expander2.pinMode(1,OUTPUT);
expander2.pinMode(2,OUTPUT);
expander2.pinMode(3,OUTPUT);
expander2.pinMode(4,OUTPUT);
expander2.pinMode(5,OUTPUT);
expander2.pinMode(6,OUTPUT);
expander2.pinMode(7,OUTPUT);

 expander0.set();
 expander1.set();
 expander2.set();

}

void loop() {
 // 1 program
   digitalWrite(LED1,HIGH);

   if (irrecv.decode(&results)) {
     
        if(results.value==0x9716BE3F)    {
     
            digitalWrite(LED1,LOW);
            delay(50);
            digitalWrite(LED1,HIGH);
            delay(50);
            expander0.digitalWrite(0, LOW);
            delay(50);
            expander0.digitalWrite(0, HIGH);
            delay(50);
            expander0.digitalWrite(1, LOW);
            delay(50);
            expander0.digitalWrite(1, HIGH);
            delay(50);
            expander0.digitalWrite(2, LOW);
            delay(50);
            expander0.digitalWrite(2, HIGH);

        }
   
 //program2

                 else if(results.value==0x3D9AE3F7)    {
            digitalWrite(LED1,LOW);
            delay (50);
            digitalWrite(LED1,HIGH);
            delay(50);
            expander2.digitalWrite(7, LOW);
            delay(50);
            expander2.digitalWrite(7, HIGH);
            delay(50);
            expander2.digitalWrite(6, LOW);
            delay(50);
            expander2.digitalWrite(6, HIGH);
            delay(50);
            expander2.digitalWrite(5, LOW);
            delay(50);
            expander2.digitalWrite(5, HIGH);
            delay(50);
            expander2.digitalWrite(4, LOW);
            delay(50);
            expander2.digitalWrite(4, HIGH);
            delay(50);

        }
    irrecv.resume();
 
    }
}

A najlepiej to powywalał bym to do zewnętrznych funkcji, a w pętli głównej tylko wywoływał je odpowiednimi instrukcjami. Wtedy program jest przejrzysty i łatwiejszy do ogarnięcia.
Kod:
#include <PCF8574.h>
#include <Wire.h>
#include <IRremote.h>  //biblioteka
#define irPin 8 //pin Arduino, do którego został podłšczony odbiornik IR
#define LED1 2

IRrecv irrecv(irPin);
decode_results results;

PCF8574 expander0;
PCF8574 expander1;
PCF8574 expander2;

void program1(); //deklaracje funkcji
void program2();

void setup() {

 Serial.begin(9600);
 irrecv.enableIRIn(); // uruchamia odbiornik podczerwieni
 
pinMode(LED1,OUTPUT);
expander0.begin(0x20);
expander0.pinMode(0,OUTPUT);
expander0.pinMode(1,OUTPUT);
expander0.pinMode(2,OUTPUT);
expander0.pinMode(3,OUTPUT);
expander0.pinMode(4,OUTPUT);
expander0.pinMode(5,OUTPUT);
expander0.pinMode(6,OUTPUT);
expander0.pinMode(7,OUTPUT);
 
expander1.begin(0x21);
expander1.pinMode(0,OUTPUT);
expander1.pinMode(1,OUTPUT);
expander1.pinMode(2,OUTPUT);
expander1.pinMode(3,OUTPUT);
expander1.pinMode(4,OUTPUT);
expander1.pinMode(5,OUTPUT);
expander1.pinMode(6,OUTPUT);
expander1.pinMode(7,OUTPUT);

expander2.begin(0x22);
expander2.pinMode(0,OUTPUT);
expander2.pinMode(1,OUTPUT);
expander2.pinMode(2,OUTPUT);
expander2.pinMode(3,OUTPUT);
expander2.pinMode(4,OUTPUT);
expander2.pinMode(5,OUTPUT);
expander2.pinMode(6,OUTPUT);
expander2.pinMode(7,OUTPUT);

 expander0.set();
 expander1.set();
 expander2.set();

}

void loop() {

   digitalWrite(LED1,HIGH);

   if (irrecv.decode(&results)) {
         if(results.value==0x9716BE3F) program1();
       else if(results.value==0x3D9AE3F7) program2();    
        irrecv.resume();
     }
}

void program1()    {
     
            digitalWrite(LED1,LOW);
            delay(50);
            digitalWrite(LED1,HIGH);
            delay(50);
            expander0.digitalWrite(0, LOW);
            delay(50);
            expander0.digitalWrite(0, HIGH);
            delay(50);
            expander0.digitalWrite(1, LOW);
            delay(50);
            expander0.digitalWrite(1, HIGH);
            delay(50);
            expander0.digitalWrite(2, LOW);
            delay(50);
            expander0.digitalWrite(2, HIGH);

        }
        
void program2()    {
            digitalWrite(LED1,LOW);
            delay (50);
            digitalWrite(LED1,HIGH);
            delay(50);
            expander2.digitalWrite(7, LOW);
            delay(50);
            expander2.digitalWrite(7, HIGH);
            delay(50);
            expander2.digitalWrite(6, LOW);
            delay(50);
            expander2.digitalWrite(6, HIGH);
            delay(50);
            expander2.digitalWrite(5, LOW);
            delay(50);
            expander2.digitalWrite(5, HIGH);
            delay(50);
            expander2.digitalWrite(4, LOW);
            delay(50);
            expander2.digitalWrite(4, HIGH);
            delay(50);

        }
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ź
  


Wiadomości w tym wątku
Led i ekspander PCF8574 - przez Tomcio - 31-05-2017, 18:09
RE: Led i ekspander PCF8574 - przez Robson Kerman - 01-06-2017, 08:36
RE: Led i ekspander PCF8574 - przez Tomcio - 01-06-2017, 11:21
RE: Led i ekspander PCF8574 - przez Robson Kerman - 01-06-2017, 11:57
RE: Led i ekspander PCF8574 - przez Tomcio - 01-06-2017, 18:48
RE: Led i ekspander PCF8574 - przez Robson Kerman - 01-06-2017, 19:32
RE: Led i ekspander PCF8574 - przez Tomcio - 01-06-2017, 20:35
RE: Led i ekspander PCF8574 - przez Robson Kerman - 01-06-2017, 23:23
RE: Led i ekspander PCF8574 - przez Tomcio - 02-06-2017, 08:52

Skocz do:


Przeglądający: 1 gości