Pages: 1 [2]   Go Down
Author Topic: i2c port expander PCF8574 as input  (Read 3938 times)
0 Members and 1 Guest are viewing this topic.
Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 514
Posts: 31543
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

To only get one output each time you change the button state then change the lines:-

attachInterrupt(5, expanderInterrupt, LOW);
to
attachInterrupt(5, expanderInterrupt, CHANGE);

Logged

Global Moderator
The Netherlands
Offline Offline
Sr. Member
*****
Karma: 1
Posts: 287
don't panic...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The pullup resistor was ok i think. In doubt check datasheet. smiley

Quote
Fig.13  Application of multiple PCF8574s with interrupt.

Jeroen







Logged

Milano, Italy
Offline Offline
Faraday Member
**
Karma: 10
Posts: 3085
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yei! I have double checked every connection again and I have ended up with a pair of codes in output what I press my button. I was able to idendify this to change the data on my lcd screen. I have still to semplify my code but more or less is working now. I will post it as soon as possible. The code of Yot was my key in this work, thanks again! Thanks to everyone smiley

I am programming this system to sobstitute the lcd clock of my car, to have an enhanced clock and the possibility to switch visual to see the temperature of many electronics I have installed (via i2c) into.

Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 55
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Can you please post the working code
Logged

Milano, Italy
Offline Offline
Faraday Member
**
Karma: 10
Posts: 3085
Sideralis Arduino!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

This is my code, it's working but perhaps not perfect smiley Keep in mind that is my code there is also the part of code that is needed by my rtc.

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WProgram.h>
#include <DS1307.h>

int rtc[7];
byte data[56];
char orario[16]; //non cambiare 16 perchè per qualche motivo non va piu' niente dopo
char dataOdierna[16];
int anno;
int changeScreen = 0;
int k = 0;
int primaAccensione = 0;

#define expander 0x20  // Address with three address pins grounded (B0100000).
                     // Note that the R/W bit is not part of this address.
volatile byte count = 0;


uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = {      0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
  
LiquidCrystal_I2C lcd(expander,8,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display


void setup()
{
  Wire.begin();
  attachInterrupt(0, expanderInterrupt, CHANGE);
 
  Serial.begin(9600);
  lcd.init();        // initialize the lcd
  lcd.noBacklight(); // accende e spegne l'uscita sul pin 12.
                     // lcd.backlight();
                     // sink current +5V------+LED-------330Rresistor------P8574pin
  
  lcd.createChar(0, bell);
  lcd.createChar(1, note);
  lcd.createChar(2, clock);
  lcd.createChar(3, heart);
  lcd.createChar(4, duck);
  lcd.createChar(5, check);
  lcd.createChar(6, cross);
  lcd.createChar(7, retarrow);
  lcd.home();
  
  lcd.print(" System");
  lcd.setCursor(0, 1);
  lcd.print(" Ready.");
  delay(1000);
  for(int i=0; i<9; i++)  {
    lcd.scrollDisplayLeft();
    delay(100);
  }
  lcd.clear();
  lcd.home();
  
  //RTC SETUP
  /*RTC.stop();
  RTC.set(DS1307_SEC,1);
  RTC.set(DS1307_MIN,26);
  RTC.set(DS1307_HR,1);
  RTC.set(DS1307_DOW,4);
  RTC.set(DS1307_DATE,30);
  RTC.set(DS1307_MTH,10);
  RTC.set(DS1307_YR,9);
  RTC.start();*/
  
  for(int i=0; i<56; i++)  {
    RTC.set_sram_byte(65,i);
  }

}

void loop()
{
  RTC.get(rtc,true);

  /*for(int i=0; i<7; i++)
   {
   Serial.println(rtc[i]);
   Serial.print(" ");
   }
   Serial.println();*/

  //rtc[0] --> secondi
  //Tramite questo IF faccio lampeggiare il : per i secondi
  if (rtc[0]%2) {
    sprintf(orario,"%02d:%02d",rtc[2],rtc[1]); //%02d converte 9 in 09 e 32 in 32
  }
  else {
    sprintf(orario,"%02d %02d",rtc[2],rtc[1]);
  }
  Serial.println(orario);
  
  anno=rtc[6]-2000;
  sprintf(dataOdierna,"%02d/%02d/%02d",rtc[4],rtc[5],anno);
  
  
  if (changeScreen==0) {
    lcd.setCursor(1,0);
    lcd.print(orario);
    lcd.setCursor(7,0);
    lcd.print(2, BYTE);
    lcd.setCursor(0,1);
    lcd.print(dataOdierna);
  }
  else if (changeScreen==1) {
    lcd.setCursor(0,0);
    lcd.print(1, BYTE);
    lcd.setCursor(1,0);
    lcd.print("XX");
    lcd.setCursor(4,0);
    lcd.print(4, BYTE);
    lcd.setCursor(5,0);
    lcd.print("XX");
    lcd.setCursor(0,1);
    lcd.print("hcca XX");
  }
  
  if (count == 1) {
    //Serial.println(expanderRead(),BIN);
    count = 0;
    attachInterrupt(0, expanderInterrupt, LOW);
    
    k++;
    if (primaAccensione==0) {changeScreen=0; primaAccensione++;}
    else if (k==1) { changeScreen=!changeScreen; lcd.clear(); }
    else if (k>1) { k=0; }
    //Serial.println(k);
  }
    
}

// display all keycodes
void displayKeyCodes(void) {
  uint8_t i = 0;
  while (1) {
    lcd.clear();
    lcd.print("Codes 0x"); lcd.print(i, HEX);
    lcd.print("-0x"); lcd.print(i+8, HEX);
    lcd.setCursor(0, 1);
    for (int j=0; j<8; j++) {
      lcd.print(i+j, BYTE);
    }
    i+=8;  
    delay(4000);
  }
}

// Funzioni per interrupt da arduino
void expanderInterrupt() {    
  detachInterrupt(0);
  count = 1;
}

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

byte expanderRead() {
  byte _data;
  Wire.requestFrom(expander, 1);
  if(Wire.available()) {
    _data = Wire.receive();
  }
  return _data;
}
Logged

Federico - Sideralis
Arduino &C: http://www.sideralis.org
Foto: http://blackman.amicofigo.com

Pages: 1 [2]   Go Up
Jump to: