piccola domandina su I2C

sto usando due PCF8574 per lcd e keypad, ma mi compaiono dei caratteri strani sul lcd, quindi ho provato a mettere due resistenze da 4.7k una su SDA e una SCL, ma.......... i2c-scanner con queste resistenze non mi trova nessun indirizzo, senza ovviamente si ma con il problema dei caratteri strani e riducendo le resistenze a 1k vengono rilevati i due indirizzi ma non mi stampa niente sull lcd?

cosa puo essere ?

L'Arduino attiva di default le resistenze di pullup integrate nei pin A4 e A5 quando usi l'I2C per cui se il bus non deve percorrere molta distanza (max 10 cm) ti dovrebbero bastare loro. Se devi fare più strada sarebbero da aggiungere delle pull-up esterne, tenendo conto del fatto che la corrente che introdurrebbero sulle linee andrebbe a sommarsi a quella delle pull-up interne e che il bus I2C richiede mediamente sui 3 mA (quindi devi calcolarti il valore delle R).

Tornando al problema principale, hai fatto un pò di test per cercare di isolare il problema? Ad esempio, mettendo il solo PCF del display, hai ancora questi problemi? Che libreria stai usando? L'LCD funziona in modalità "classica"?

Uso la libreria LiquidCystal_I2C e Keypad_I2C se carico il solo sketch di prova Helllo World funziona benissimo e pure il keypad risponde bene.....il pcf non so cone uscluderlo a parte non "dichiararlo".

Cosa significa in modalità classica ??

tronicman:
Cosa significa in modalità classica ??

Credo @Leo intenda LCD collegato ad Arduino senza passare dal PCF.

Come le hai collegate le resistenze?

Come le hai collegate le resistenze?

e che giro fai fare ai cavi ? Arduino - LCD e Arduino - Tastiera o Arduino - LCD - Tastiera?
Quanto lunghi sono i cavi di collegameno?
Ciao Uwe

uwefed:

Come le hai collegate le resistenze?

e che giro fai fare ai cavi ? Arduino - LCD e Arduino - Tastiera o Arduino - LCD - Tastiera?
Quanto lunghi sono i cavi di collegameno?
Ciao Uwe

ho Arduino (SDA - SCL) --->20cm di cavi ----> e questo circuitino https://drive.google.com/file/d/0ByoKd_e1bIw5eTBQNTFXTktub2s/edit?usp=sharing

le resistenze le ho messe subito dopo i pin headers 3-4 del circuito

Di pull-up, giusto? Di che valore?

All inizio da 4200 ma lo scanner i2c non rileva indirizzi quindi ho provato con 1000 e gli indirizzi vengono trovati ma si vede solo una serie di quadrati bianchi e senza resistenze funziona tutto ma con la comparsa di caratteri strani

tronicman:
Uso la libreria LiquidCystal_I2C e Keypad_I2C se carico il solo sketch di prova Helllo World funziona benissimo e pure il keypad risponde bene

ma quindi perche' prendersela con l'hw ?

Testato:
ma quindi perche' prendersela con l'hw ?

e allora con cosa devo litigare ]:smiley:

L'obiezione di Testato è ragionevole. Se gli sketch separati ti funzionano, ma non ti fanno insiene, potrebbe anche darsi che ci sia un problema a livello software.

grazie per il ragionevole XD

a questo punto invece di postare le foto posta lo sketch completo che non ti funziona, e poi se una buon'anima gli da' uno sguardo vedrai che viene fuori la magagna

Raga abbiate pazienza..........non ci credo.......mi deprimo troppo :fearful: quando scopro che decommentado Serial.begin(9600); funziona

Anzi no è stato temporaneo....appena ho iniziato a spippolare con la keypad .......PAAAMM!!!......sono tornati i caratteri strani

Per lo meno si esclude il problema hardware.....come volevasi dimastrare eh Testato ?!?!?!

Non ho capito il problema.

mah in verità nemmeno io.......cmq appena ho decommentato il Serial.begin ha smesso di dare i caratteri strani, che si vedevano sin dalla fase di setup, quando stampava "Starting System"

#include <SoftwareSerial.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad_I2C.h> 
#include <Keypad.h> 
#include "sms.h"
#include "SIM900.h"
#include "call.h"

SMSGSM sms;
CallGSM call;

char position;  
char phone_number[20]; 
char sms_text[160];
boolean started=false;
byte stat=0;

LiquidCrystal_I2C lcd(0x20,16,2);

#define I2CADDR 0x24

const byte ROWS = 4;
const byte COLS = 4; 

char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {7, 6, 5, 4}; 
byte colPins[COLS] = {3, 2, 1, 0}; 

Keypad_I2C customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR); 

char password[5] = "1234";
char tmpKey[10];
int tmpKeyIndex = 0;
boolean login, a, aa, b, bb, c, cc;
int temp; 
String mess;

void setup() 
{
  
  lcd.init();                     
  lcd.backlight();
  
  pinMode(sensAA, INPUT);
  digitalWrite(sensAA, LOW);
  
 
  customKeypad.begin( );
  //Serial.begin(9600); ----------------->qui  ho decommentato
  lcd.print(F("Starting system"));
 if (gsm.begin(9600)){
     lcd.setCursor(0,1);
     lcd.print(F("GSM status:READY"));
     started=true;  
  }else { lcd.setCursor(0,1);
          lcd.print(F("GSM status:IDLE"));
  }
  delay(500);
  lcd.clear();
};

void loop() 
{
  
  temp = analogRead(0);
  temp = (5.0 * temp * 100.00) / 1024.0;
  
  checkALARM();
  
  if (!login) {lcd.setCursor(0,0); 
               lcd.print(F("Password:"));
               lcd.setCursor(0,1); 
               lcd.print(mess);
               lcd.print(F("  T:"));
               lcd.print(temp);
               lcd.print(F("  "));
               }
               
  char Key = customKeypad.getKey();
  if (Key){
      tmpKey[tmpKeyIndex] = Key;
      lcd.setCursor((9+tmpKeyIndex),0);
      tmpKeyIndex++;
      lcd.print(Key);
       
    
      if (String(Key)=="#") { lcd.setCursor(0,0);
                              lcd.print(F(" disconnesso"));  
                              delay(500);
                              lcd.clear();
                              login = false;
                              tmpKeyIndex = 0;}
                              
      if (String(Key)=="*") {         
        if (checkPass() || login == true) {
            lcd.setCursor(0,1);
            lcd.print(F("comando: "));
            checkCMD(String(tmpKey));
            login = true; }
          else {lcd.setCursor(0,1);
                lcd.print(F(" Password errata"));
                delay(500);
                lcd.clear();
                login = false; }
                    
         tmpKeyIndex = 0;
      } 
      
  }

ora solo se premo il carattere # mi compaiono i caratteri strani

  1. perché includi le lib <Keypad_I2C.h> e <Keypad.h>? La prima esclude l'altra.
  2. forse la seriale è usata per il debug da una delle tante lib incluse.

se non la includo mi da:

ALLARME_i2c:45: error: ‘makeKeymap’ was not declared in this scope
ALLARME_i2c.ino: In function ‘void loop()’:
ALLARME_i2c:101: error: ‘class Keypad_I2C’ has no member named ‘getKey’

e poi le due librerie keypad sono incluse anche nell esempio

La Keypad_I2C che conosco io include già di suo la Keypad e la Wire:

#include "Keypad.h"
#include "Wire.h"

se apri l'esempio CustomKeypad_I2C.ino nel link che mi hai postato ci sono entrambe le librerie incluse

/* @file CustomKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates changing the keypad size and key values.
|| #
Use with I2C i/o G. D. (Joe) Young Feb 28/12
*/
#include <Keypad_I2C.h>
#include <Keypad.h> // GDY120705
#include <Wire.h>