#include <Wire.h>
uint8_t bme_index=0;
uint8_t sht_index=0;
uint8_t found_device_index=0;
enum MessageType { PAIRING,
DATA,
DATA_CAN,
DATA_ILOG,
DATA_TEMPERATURE,
DATA_PRESSURE,
DATA_HUMIDITY,
DATA_TPH,//TEMPERATURE, PRESSURE, HUMIDITY
DATA_DMS
};
MessageType messageType;
struct DeviceInfo {
uint8_t address;
uint8_t tca_ch;
const char* name;
};
const DeviceInfo deviceTable[] = {
{0x44,0, "SHT2X85"},
{0x76,0, "BMP280"},
{0x76,0, "BME280"},
{0x5A,0, "DHT22"}, // This is a placeholder; DHT22 doesn't use I2C but included for example
{0x60,0, "SHT30"},
{0x3C,0, "SSD1306"},
{0x27,0, "LCD"}
// Add more devices as needed
};
const int deviceCount = sizeof(deviceTable) / sizeof(deviceTable[0]);
typedef union SensorData {
struct {
int temperature;
int humidity;
int pressure;
} tph; // Temperature, Pressure, Humidity
struct {
int temperature;
int humidity;
} th; // Temperature, Humidity
struct {
int temperature;
int pressure;
} tp; // Temperature, Pressure
struct {
int temperature;
} t; // Temperature only
struct {
int humidity;
} h; // Humidity only
struct {
int pressure;
} p; // Pressure only
} SensorData;
typedef enum SensorMessageType {
SENSOR_DATA_TPH,
SENSOR_DATA_TH,
SENSOR_DATA_TP,
SENSOR_DATA_T,
SENSOR_DATA_H,
SENSOR_DATA_P
} SensorMessageType;
enum PairingStatus { NOT_PAIRED,
PAIR_REQUEST,
PAIR_REQUESTED,
PAIR_PAIRED,
};
PairingStatus pairingStatus = NOT_PAIRED;
typedef struct struct_message {
MessageType msgType = DATA_TPH;
SensorMessageType data_type=SENSOR_DATA_TH;
uint8_t TPH_number=1; //DUT2, DUT3, DUT4, DUT5, DUT6,...MAX_DUTS
uint8_t sensor_addr[16];
SensorData data[16];
} struct_message;
typedef struct SensorDetails {
uint8_t sensor_addr;
uint8_t tca_ch;
uint8_t tca_index;
} SensorDetails;
typedef struct struct_pairing { // new structure for pairing
uint8_t msgType;
uint8_t id;
uint8_t macAddr[6];
uint8_t channel;
char dut_name[14];
int free_dut_number;
} struct_pairing;
const uint8_t TCA_ADDRESSES[] = {0x70, 0x71}; // Addresses of the two TCAs
//Create 2 struct_message
struct_message outData; // data to send
//struct_message inData; // data received
struct_pairing pairingData;
SensorDetails sensorDetails_bme[16];
SensorDetails sensorDetails_sht[16];
void tcaSelect(uint8_t i, uint8_t tcaIndex) {
if (i > 7) return; // Check for valid channel
if (tcaIndex > 1) return; // Check for valid TCA index
Wire.beginTransmission(TCA_ADDRESSES[tcaIndex]);
Wire.write(1 << i);
Wire.endTransmission();
}
void scanI2CBus(uint8_t tcaChannel, uint8_t tcaIndex) {
tcaSelect(tcaChannel, tcaIndex);
for (uint8_t addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
for (int i = 0; i < deviceCount; i++) {
if (deviceTable[i].address == addr) {
if(found_device_index>15) break;
outData.sensor_addr[found_device_index] = addr ; // Save sensor address
Serial.print("Sensor Found: ");
Serial.print("TCA ");
Serial.print(tcaIndex);
Serial.print(", Channel ");
Serial.print(tcaChannel);
Serial.print(", Address 0x");
Serial.println(addr, HEX);
Serial.print(" device_index: ");
Serial.println( found_device_index);
switch(addr){
case 0x3C://SHT2X85
sensorDetails_sht[sht_index].sensor_addr=addr;
sensorDetails_sht[sht_index].tca_ch=tcaChannel;
sensorDetails_sht[sht_index].tca_index=tcaIndex;
sht_index++;
break;
case 0x27://BME280
sensorDetails_bme[bme_index].sensor_addr=addr;
sensorDetails_bme[bme_index].tca_ch=tcaChannel;
sensorDetails_bme[bme_index].tca_index=tcaIndex;
bme_index++;
break;
case 0x5A:
break;
case 0x60:
break;
}
found_device_index++;
break;
}
}
}
}
}
void setup_sensors() {
//setup sht sensors
for (int i=0;i<sht_index;i++){
tcaSelect(sensorDetails_sht[sht_index].tca_ch, sensorDetails_sht[sht_index].tca_index);
Serial.printf("SHT sensor %i initialized\n", i);
}
for (int i=0;i<bme_index;i++){
tcaSelect(sensorDetails_bme[bme_index].tca_ch, sensorDetails_bme[bme_index].tca_index);
Serial.printf("BME sensor %i initialized\n", i);
}
}
float get_random_float(byte type){
if(type==0)return random(-40,150)*1.05f;
if(type==1)return random(0,100)*1.05f;
if(type==2)return random(786,1100)*1.05f;
else return 0;
}
void read_Sensors() {
//read sht sensors
static uint8_t sensor_index = 0;
for (int i=0;i<sht_index;i++){
tcaSelect(sensorDetails_sht[sht_index].tca_ch, sensorDetails_sht[sht_index].tca_index);
outData.data[sensor_index].tph.temperature=int(get_random_float(0)*10);//multiply by 10 to use integer for transfer
outData.data[sensor_index].tph.humidity=int(get_random_float(1)*10);//multiply by 10 to use integer for transfer
sensor_index++;
}
//read bme sensors
for (int i=0;i<bme_index;i++){
tcaSelect(sensorDetails_bme[bme_index].tca_ch, sensorDetails_bme[bme_index].tca_index);
outData.data[sensor_index].tph.temperature=int(get_random_float(0)*10);//multiply by 10 to use integer for transfer
outData.data[sensor_index].tph.humidity=int(get_random_float(1)*10);//multiply by 10 to use integer for transfer
outData.data[sensor_index].tph.pressure=int(get_random_float(2)*10);//multiply by 10 to use integer for transfer
sensor_index++;
}
}
void print_sensor_data(){
for (int i=0;i<16;i++){
Serial.print("Sensor ");
Serial.print(i);
Serial.print(" Temperature: ");
Serial.print(outData.data[i].tph.temperature/10.0f);
Serial.print(" Humidity: ");
Serial.print(outData.data[i].tph.humidity/10.0f);
Serial.print(" Pressure: ");
Serial.print(outData.data[i].tph.pressure/10.0f);
Serial.print(" addr: 0x");
Serial.println(outData.sensor_addr[i],HEX);
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.printf("struct size: %d\n",sizeof(struct_message));
Wire.begin();
for (uint8_t tcaIndex = 0; tcaIndex < 2; tcaIndex++) {
for (uint8_t i = 0; i < 8; i++) {
scanI2CBus(i, tcaIndex); // Scan each channel on each TCA
}
}
setup_sensors();
}
void loop() {
// put your main code here, to run repeatedly:
read_Sensors();
//print_sensor_data();
delay(5000); // this speeds up the simulation
}