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?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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));

}


Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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...
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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