change the address of i2c sensors

I'm wondering is it possible to change the chronodot's address to different pins on the arduino board and have the co2 sensor(k30 co2 meter) on the i2c pins for mega 2560? or vice versa
This is my current code ---and I was using the UART PINS but I had an accident and I can no longer use the TX pin.

#include "SoftwareSerial.h"
#include "SD.h"
#include "Wire.h" 
SoftwareSerial K_30_Serial(12,13); //Sets up a virtual serial port
 //Using pin 13 for Rx and pin 12 for Tx
byte readCO2[]={0xFE, 0X44, 0X00, 0X08, 0X02, 0X9F, 0X25}; //Command packet to read Co2 (see app note)
byte response[]={0,0,0,0,0,0,0}; //create an array to store the response
//multiplier for value. default is 1. set to 3 for K-30 3% and 10 for K-33 ICB
int valMultiplier = 10;
int pin =8;
unsigned long duration;
unsigned long starttime;
unsigned long sampletime_ms=3000;//sampe 30s ;
unsigned long lowpulseoccupancy=0;
float ratio=0;
float concentration=0;
int temperatureCommand=3;  
int humidityCommand=5;  
int clockPin=2;  
int dataPin=3;
int val;
int ack;
float temperature;
float humidity;
const int chipSelect=53;
float refresh_rate=0.0;
long Num=1;

void setup()
{
K_30_Serial.begin(9600);
Wire.begin();
Serial.begin(9600);
Serial.print("Initializing SD card...");
Wire.beginTransmission(0x68); // address DS3231
  Wire.write(0x0E); // select register
  Wire.write(0b00011100); // w
 pinMode(53, OUTPUT);
pinMode(28,INPUT);
  starttime = millis();//get the current time;
pinMode (22,INPUT);
pinMode (23,INPUT); 
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("card initialized.");

File commandFile= SD.open("COMMANDS.txt");
if (commandFile)
{ 
  Serial.println("Reading Command File");
  float decade=pow(10,(commandFile.available()-1));
  while
  (commandFile.available())
  {
    float temp= (commandFile.read()-'0');
    refresh_rate= temp* decade + refresh_rate;
    decade=decade/10;
  }
  Serial.print("Refresh Rate=");
  Serial.print(refresh_rate);
  Serial.println("ms");
  commandFile.close();
}
else
{
Serial.println("Could not readd command File");
return;
}
File logFile=SD.open("LOG25.csv",FILE_WRITE);
if (logFile)
{
  logFile.println(",,,,");
  String header= "Num,Temperature,Humidity,CO2,Dust concentration,time";
  logFile.println(header);
  logFile.close();
  Serial.println(header);
}
else
{
  Serial.println ("Couldn't Open log file");
}
}

void loop()
{sendRequest(readCO2);
  unsigned long valCO2 = getValue(response);
 Serial.print("Co2 ppm = ");
 Serial.println(valCO2);
delay(refresh_rate);
duration = pulseIn(pin, LOW);
lowpulseoccupancy = lowpulseoccupancy+duration;
if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s
  {
    ratio = lowpulseoccupancy/(sampletime_ms*10.0);  // Integer percentage 0=>100
    concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
     Serial.print(lowpulseoccupancy);
    Serial.print(",");
    Serial.print(ratio);
    Serial.print(",");
    Serial.println(concentration);
    lowpulseoccupancy = 0;
    starttime = millis();
    delay (refresh_rate);
  }
  sendCommandSHT(temperatureCommand, dataPin, clockPin);
  waitForResultSHT(dataPin);
  val = getData16SHT(dataPin, clockPin);
  skipCrcSHT(dataPin, clockPin);
  temperature = (float)val * 0.01 - 40;
  temperature = (float)temperature;
  
  sendCommandSHT(humidityCommand, dataPin, clockPin);
  waitForResultSHT(dataPin);
  val = getData16SHT(dataPin, clockPin);
  skipCrcSHT(dataPin, clockPin);
  humidity = -4.0 + 0.0405 * val + -0.0000028 * val * val;
  
   Serial.print(temperature*100);
   Serial.println(humidity*100);
  delay(refresh_rate);
 // send request to receive data starting at register 0
 {
   Wire.beginTransmission(0x68); // 0x68 is DS3231 device address
  Wire.write((byte)0); // start at register 0
  Wire.endTransmission();
  Wire.requestFrom(0x68, 3); // request three bytes (seconds, minutes, hours)
  while(Wire.available())
    {
     int seconds = Wire.read(); // get seconds
    int minutes = Wire.read(); // get minutes
    int hours = Wire.read();   // get hours
    seconds = (((seconds & 0b11110000)>>4)*10 + (seconds & 0b00001111)); // convert BCD to decimal
    minutes = (((minutes & 0b11110000)>>4)*10 + (minutes & 0b00001111)); // convert BCD to decimal
    hours = (((hours & 0b00100000)>>5)*20 + ((hours & 0b00010000)>>4)*10 + (hours & 0b00001111)); // convert BCD to decimal (assume 24 hour mode)
 Serial.print(hours); Serial.print(":"); Serial.print(minutes); Serial.print(":"); Serial.println(seconds);  
delay (1000);
 String dataString= String(Num)+","+String(temperature)+","+String(humidity)+","+String(valCO2)+","+String(concentration)+","+String (hours)+":"+String(minutes)+":"+String (seconds);
      File logFile= SD.open("LOG25.csv",FILE_WRITE);
  if (logFile)
{
logFile.println(dataString);
logFile.close();
Serial.println(dataString);
}
else
{
  Serial.println("couldn't open log File");
}
Num++;

delay(refresh_rate);
    }
 }
}

void sendRequest(byte packet[])
{
 while(!K_30_Serial.available()) //keep sending request until we start to get a response
 {
 K_30_Serial.write(readCO2,7);
 delay(50);
 }

 int timeout=0; //set a timeoute counter
 while(K_30_Serial.available()< 7) //Wait to get a 7 byte response
 {
 timeout++;
 if(timeout>10) //if it takes to long there was probably an error
 {
 while(K_30_Serial.available()) //flush whatever we have
 K_30_Serial.read();

 break; //exit and try again
 }
 delay(50);
 }

 for (int i=0; i <7; i++)
 {
 response[i]=K_30_Serial.read();
 }
}
unsigned long getValue(byte packet[])
{
 int high = packet[3]; //high byte for value is 4th byte in packet in the packet
 int low = packet[4]; //low byte for value is 5th byte in the packet

 unsigned long val = high*256 + low; //Combine high byte and low byte with this formula to get value
 return val* valMultiplier;
}

int shiftIn(int dataPin, int clockPin, int numBits) {
  int ret = 0;
  for (int i=0; i<numBits; ++i) {
    digitalWrite(clockPin, HIGH);
    //delay(10); not needed :)
    ret = ret*2 + digitalRead(dataPin);
    digitalWrite(clockPin, LOW);
  }
  return(ret);
}

// send a command to the SHTx sensor
void sendCommandSHT(int command, int dataPin, int clockPin) {
  int ack;

  // transmission start
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, LOW);
  
  // shift out the command (the 3 MSB are address and must be 000, the last 5 bits are the command)
  shiftOut(dataPin, clockPin, MSBFIRST, command);
  
  // verify we get the right ACK
  digitalWrite(clockPin, HIGH);
  pinMode(dataPin, INPUT);
  ack = digitalRead(dataPin);
  if (ack != LOW)
    Serial.println("ACK error 0");
  digitalWrite(clockPin, LOW);
  ack = digitalRead(dataPin);
  if (ack != HIGH)
    Serial.println("ACK error 1");
}

// wait for the SHTx answer
void waitForResultSHT(int dataPin) {
  int ack;
  
  pinMode(dataPin, INPUT);
  for(int i=0; i<100; ++i) {
    delay(10);
    ack = digitalRead(dataPin);
    if (ack == LOW)
      break;
  }
  if (ack == HIGH)
    Serial.println("ACK error 2");
}

// get data from the SHTx sensor
int getData16SHT(int dataPin, int clockPin) {
  int val;

  // get the MSB (most significant bits)
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  val = shiftIn(dataPin, clockPin,8);
  val *= 256; // this is equivalent to val << 8;
  
  // send the required ACK
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);
  
  // get the LSB (less significant bits)
  pinMode(dataPin, INPUT);
  val |= shiftIn(dataPin, clockPin,8);
  return val;
}
// skip CRC data from the SHTx sensor
void skipCrcSHT(int dataPin, int clockPin){ 
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);
}

The DS3231 chip which the Chronodot uses, it has fixed I2C address 0x68 and it is unable to change. If you are asking about different pins use on the Arduino (it doesn't matter with I2C address) the answer is also not. Built in I2C functionality on ATmega is on specific pins and they are on Arduino's header next to AREF pin. They are also on 20, 21 for Mega2560 but for UNO are on different pins so they are doubled on fixed place next to AREF for R3 Arduinos.

mikhailtrought:
I'm wondering is it possible to change the chronodot's address to different pins on the arduino board and have the co2 sensor(k30 co2 meter) on the i2c pins for mega 2560? or vice versa
This is my current code ---and I was using the UART PINS but I had an accident and I can no longer use the TX pin.

If this is the CO2 sensor you are using then yes, you can use the I2C interface it's default Slave address is 0x68 though, the same as your RTCC. The document says you can change the I2C slave address usings the RX/TX interface?

did you damage the TX/RX on the Sensor or on the Mega. The MEGA has 4 hardware Serial ports, Serial, Serial1, Serial2, Serial3

Why are you using Software Serial?

Chuck.

I had the co2 sensor on UART and damaged its TX pin, but I have to change the code in order to accomodate for the I2c addresses which for both sensors it is 0x68