I2C/TWI Interface analoge poorten veranderen

Ik was bezig met wat uit te proberen met een lcd schermpje.
Ik heb daarbij een I2C/TWI Interface gebruikt, die zet (ik meende 6) poorten van de arduino om naar 2 poorten, handig om wat ruimte te houden voor wat andere toepassingen.
Nu heb ik alleen een probleem, ik gebruik de arduino uno, samen met het datalog shield incl rtc.
Maar dat data shield gebruikt dus dezelfde poorten als het schermpje nu zou moeten gebruiken, namelijk analog poort 4 en 5.
Hoe kan ik dat veranderen dat ik in de code schrijf dat de lcd analog pin 1 en 2 moet gebruiken in plaats van 4 en 5?

Dit is de code waarbij het scherm werkt en ik de temperatuur en luchtvochtigheid in het scherm projecteer.
Daarbij moet ik nog de code voor de datalogger en rtc zetten, maar het leek me handig om eerst dit werkend te krijgen op andere poorten.

/* YourDuino.com Example Software Sketch
 16 character 2 line I2C Display
 Backpack Interface labelled "YwRobot Arduino LCM1602 IIC V1"
 terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <Wire.h>  // Comes with Arduino IDE
// Get the LCD I2C Library here: 
// https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
// Move any other LCD libraries to another folder or delete them
// See Library "Docs" folder for possible commands etc.
#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
// set the LCD address to 0x27 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

/*-----( Declare Variables )-----*/
//NONE



#include <dht.h>

dht DHT;

#define DHT22_PIN 5

struct
{
    uint32_t total;
    uint32_t ok;
    uint32_t crc_error;
    uint32_t time_out;
    uint32_t connect;
    uint32_t ack_l;
    uint32_t ack_h;
    uint32_t unknown;
} stat = { 0,0,0,0,0,0,0,0};



void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);  // Used to type in characters

  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight

// ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i< 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  

//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0  
  lcd.setCursor(0,0); //Start at character 4 on line 0
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("Welkom");
  delay(8000);  

// Wait and then tell user they can start the Serial Monitor and type in characters to
// Display. (Set Serial Monitor option to "No Line Ending")
  lcd.clear(                          );
 


Serial.begin(9600);
    Serial.println("dht22_test.ino");
    Serial.print("LIBRARY VERSION: ");
    Serial.println(DHT_LIB_VERSION);
    Serial.println();
    Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)\tTime (us)");
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("AT");
  lcd.setCursor(6, 0);
  lcd.print("RH");


}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
    // READ DATA
    Serial.print("DHT22, \t");
    uint32_t start = micros();
    int chk = DHT.read22(DHT22_PIN);
    uint32_t stop = micros();
    stat.total++;

    // DISPLAY DATA
    Serial.print(DHT.humidity, 1);
    Serial.print(",\t");
    Serial.print(DHT.temperature, 1);
    Serial.print(",\t");
    Serial.print(stop - start);
    Serial.println();

    lcd.setCursor(0, 1);
    lcd.print("     ");
    lcd.setCursor(0, 1);
    lcd.print(DHT.temperature);
    lcd.setCursor(6, 1);
    lcd.print("     ");
    lcd.setCursor(6, 1);
    lcd.print(DHT.humidity);

    
  
}

Ik heb je post 3 keer door moeten lezen en ik denk dat ik nu begrijp wat je bedoelt. In principe heb je te weinig informatie gegeven.

Welk data shield gebruik je en/of welk type RTC zit daar op. ?

In het geval er een DS1307 op zit is er geen probleem. De RTC1307 gebruikt ook de I2C bus op adres 0x68 en de LCD gebruikt I2C bus op adres 0x27 dus dat past allebei op dezelfde pinnen A4 en A5 0x27 geef je aan in de regel: LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

In het geval er een DS1302 op zit heb je ook geen probleem want die gaat vla de SPI poort samen met de SD kaart die ook op je datalog shield zit ?? neem ik aan. (niet genoeg informatie in je vraag) (SPI = pin 11,12,13)

Analoog pin 4+5 is standaard de I2C bus en dit kun je niet veranderen. (hardwarematig in de ATmega328-chip gebakken))

Ik vermoed dat het datalog-shield met RTC en de I2C-LCD gewoon samen kan werken zonder problemen.

Heel hartelijk bedankt! Excuses voor de onduidelijkheden, maar je begreep gelukkig wat ik bedoelde.

Ik begreep dus niet helemaal goed hoe het in zijn werk ging met die analoog pinnen 4 en 5. Ik had het idee dat die problemen ging geven omdat de datalogger ook die pinnen gebruikte. Dat, omdat ik eerder had gelezen dat je soms pinnen moest wijzigen omdat sommige onderdelen op dezelfde pinnen geprogrammeerd zijn. Omdat het dus om een I2C bus gaat en ze dus beide een ander adres gebruiken geeft het geen problemen. Dit is het shield dat ik heb. http://www.ebay.com/itm/191138232800?_trksid=p2059210.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

En inderdaad, ik heb net de code voor de datalogger met rtc erbij gezet en het werkt gewoon.

Je kunt in principe nog meer I2C chips/boards aan die bus hangen. Zolang ze maar verschillende adressen hebben. De LCD display gebruikt waarschijnlijk de PCF8574, die kunnen d.m.v. soldeereilandjes of dipswitches ingesteld worden op adressen tussen 0x20 en 0x27. Dan hebt b.v. ook I2C eeproms die op dezelfde manier ingesteld kunnen worden voor een adres tussen 0x50 en 0x57. Andere chips hebben ook een eigen adres.

I2C adressen liggen altijd tussen 0x00 en 0x7F ( tussen 0 en 127 decimaal) Het laatste bit bepaald de modus, of schrijven naar of lezen van het I2C appparaat. (Sommige adressen zijn gereserveerd voor speciale toepassingen.)

Dit kleine testprogramma I2C scanner kan heel makkelijk zijn als je wilt weten op welke adressen de I2C apparaten ingesteld zijn.

Op de interface voor het lcd scherm zitten (neem ik aan) soldeereilandjes, A0, A1, A2, daarmee zou ik dan dus het adres kunnen veranderen als dat nodig moest zijn?

Dankjewel voor je uitgebreide reactie. Dat programma om te kijken op welke poorten een apparaat/interface werkt is een handige, ik zal het eens uitproberen.

MatthijsB:
Op de interface voor het lcd scherm zitten (neem ik aan) soldeereilandjes, A0, A1, A2, daarmee zou ik dan dus het adres kunnen veranderen als dat nodig moest zijn?

Inderdaad, daarmee stel je het I2C adres van het interface IC PCF8574, de I/O-port uitbreider in.
1 van de 3, 2 van de 3 , alle 3 of geen enkel eilandje doorverbinden. Totaal 8 mogelijkheden, dus adressen.
Je zou dus teoretisch 8 LCD schermpjes aan dezelfde 2-draden/I2C-bus kunnen hangen met allemaal verschillende weergave.

Let wel op. Er is ook een PCF8574A (de A is toegevoegd). Dat is hetzelfde ding, maar het basis adres ligt hier op 0x38, en het bereik loopt tot 0x3F, waarmee je dus in totaal 16 van deze chippies kunt gebruiken op dezelfde bus. Ik vind het de moeite waard dat te noemen, omdat als je dat niet weet, je de beide versies met elkaar zou kunnen verwarren en tegen onnodige frustraties aan zou kunnen lopen.

@MAS3

Klopt als een bus. bedankt voor de aanvulling.

Er is ook nog een 16bit I/O expander (poort uitbreider) de MP23017 met basis I2C adres 0x20 .

Gelukkig is er het kleine programmaatje I2C-Scanner waarmee je uitzoekt op welk I2C adress je chip is ingesteld. Gewoon even scannen en je hoeft niet gefrustreerd te geraken. :stuck_out_tongue: