Go Down

Topic: PCF8574 duvida (Read 1 time) previous topic - next topic

ricardomira77

ola, é possivel criar uma array ou algo parecido para contralar de forma mais facil o PCF8574
tipo

P0 = 0
P1 = 1
P2 =0

eu estou usando esse codigo:

Code: [Select]

#include "Wire.h"
#define expander 0x20

void setup()
{
Wire.begin();
}

void loop()
{
 
  expanderWrite(B11111111);
  delay(1000);

  expanderWrite(B00000000);
  delay(1000);
}

void expanderWrite(byte _data )
{
  Wire.beginTransmission(expander);
  Wire.write(_data);
  Wire.endTransmission();
 
}



bubulindo

E de que maneira é que o array ia controlar o PCF8574?
This... is a hobby.

ricardomira77

para ativar uma porta no PCF8574 eu estou usando o expanderWrite(B11111111)

mais gostaria de simplificar usando algo do tipo writedigital(P0, Low)

ponde o P0 seria a porta 0 do PCF8574


bubulindo

Com array é menos eficiente... algo como:

Code: [Select]


#define P0   0x1
#define P1   0x2
#define P2   0x4
#define P3   0x8
//completa o resto

void expanderBitWrite( unsigned char bit, unsigned char value) {

unsigned char status = expanderRead(); //deve haver uma destas funcões para ler o estado do registo

if (value == HIGH) expanderWrite(status | bit);
else expanderWrite(status &~(bit));

}


This... is a hobby.

ricardomira77

#4
Apr 17, 2012, 01:52 am Last Edit: Apr 17, 2012, 01:57 am by ricardomira77 Reason: 1
ok eu vou olhar seu codigo com calma para entender
eu usar assim no Bascom-AVR usando BASIC

Code: [Select]

**Variavel
Dim Bytearray(1) As Byte


** Saidas
S1 Alias Bytearray(1).0
S2 Alias Bytearray(1).1
S3 Alias Bytearray(1).2
S4 Alias Bytearray(1).3
S5 Alias Bytearray(1).4
S6 Alias Bytearray(1).5
S7 Alias Bytearray(1).6

S1 = 0
S2 = 1
S4 = 1

*** depois mandava assim

' Envias dados PC8574
I2cstart
I2cwbyte Pcf8574
I2cwbyte Bytearray(1)
I2cstop




S8 Alias Bytearray(1).7



bubulindo

Eu não sei BASIC...
This... is a hobby.

ricardomira77

opa eu achei uma biblioteca para usar com o PCF8574

http://skyduino.wordpress.com/librairie-arduino-pcf8574-pcf8575/

ficou mais simples:

Code: [Select]
#include <PCF8574.h> // Required for ... all

#include <Wire.h> // Required for I2C communication

PCF8574 expander; // Create object from PCF8574 class

void setup(){

  Serial.begin(9600); // Setup serial for read echo
 
  expander.pinMode(0,OUTPUT); // Setup pin D0 as output
  expander.pinMode(1,OUTPUT); // Setup pin D1 as output
  expander.pinMode(2,OUTPUT); // Setup pin D2 as output
 
  expander.set(); // coloca todas as saidas em HIGH
  expander.begin(0x20);
 
}

void loop(){
  expander.digitalWrite(0, LOW); // Blink led 1
  delay(1000);
  expander.digitalWrite(0, HIGH); // Blink led 2
  delay(1000);

} // Loop forever

kabeleraape

Boa Noite.

Estou usando esta mesma biblioteca e queria dar nome aos pino do PCF8574 como no caso dos servos, parei nesta parte e não consigo avançar:
#include <Wire.h>
#include <Servo.h>
#include <PCF8574.h>
#include <LiquidCrystal_I2C.h>

PCF8574 PCF_EXP1;

//SERVOS
const int SPEEDO_PIN                         =A0;
const int RPM_PIN                               = 5;
const int BRAKE_AIR_PRESSURE_PIN      = 6;
const int FUEL_PIN                              = 9;
const int OIL_TEMPERATURE_PIN           =10;
const int WATER_TEMPERATURE_PIN      =11;

//LEDS
const int PCF_EXP1 RIGHT_INDICATOR    =P0;
const int FUEL_WARNING                      =P1;
const int PARKING_BREAK                     =P2;
const int LIGHT_PARKING                      =P3;
const int MOTOR_BRAKE                        =P4;
const int LIGHT_HIGH_BEAM                  =P5;
const int BATTERY_VOLTAGE_WARNING   =P6;
const int LEFT_INDICATOR                     =P7;

void setup() {
  Serial.begin(115200);
  PCF_EXP1.begin(0x20);
}

void loop() {
}

Desde ja muito obrigado!

luisilva

Não sei se estou a perceber bem a questão, mas penso que o problema deve estar relacionado com estas linhas:
Code: [Select]
const int PCF_EXP1 RIGHT_INDICATOR    =P0;
const int FUEL_WARNING                      =P1;
const int PARKING_BREAK                     =P2;
const int LIGHT_PARKING                      =P3;
const int MOTOR_BRAKE                        =P4;
const int LIGHT_HIGH_BEAM                  =P5;
const int BATTERY_VOLTAGE_WARNING   =P6;
const int LEFT_INDICATOR                     =P7;


Tente fazer:
Code: [Select]
const int PCF_EXP1 RIGHT_INDICATOR    = 0;
const int FUEL_WARNING                      = 1;
const int PARKING_BREAK                     = 2;
const int LIGHT_PARKING                      = 3;
const int MOTOR_BRAKE                        = 4;
const int LIGHT_HIGH_BEAM                  = 5;
const int BATTERY_VOLTAGE_WARNING   = 6;
const int LEFT_INDICATOR                     = 7;


Assim, já pode chamar outro nome aos pinos e fazer:
Code: [Select]
  expander.pinMode(FUEL_WARNING, OUTPUT);
e:
Code: [Select]
  expander.digitalWrite(FUEL_WARNING, HIGH);

Go Up