Anyone has an idea why i cant read 2 in a row :
Code: Select all
main.c :
////////////////////////////////////////////
// get time from rtc 0x68
// temp from 0x48
// temp from 0x49
// display on 0x3C
////////////////////////////////////////////
#include <stdio.h>
#include <stdbool.h>
#include "ssd1306.h"
#include "lm75.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_sleep.h"
#include <time.h>
#include <sys/time.h>
#define PRECOMPILED_TIMESTAMP __TIME__
#define I2C_MASTER_SCL_IO 1
#define I2C_MASTER_SDA_IO 2
#define I2C_MASTER_NUM I2C_NUM_0
#define I2C_MASTER_FREQ_HZ 100000
#define TMP1075_1_I2C_ADDR 0x48
#define TMP1075_2_I2C_ADDR 0x49
static ssd1306_handle_t ssd1306_dev = NULL;
void app_main(void) {
// I2C master
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = I2C_MASTER_SCL_IO,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
.clk_flags = I2C_SCLK_SRC_FLAG_FOR_NOMAL
};
i2c_param_config(I2C_MASTER_NUM, &conf);
i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0);
// I2C display
i2cdev_init();
ssd1306_dev = ssd1306_create(I2C_MASTER_NUM, SSD1306_I2C_ADDRESS);
ssd1306_refresh_gram(ssd1306_dev);
ssd1306_clear_screen(ssd1306_dev, 0x00);
// I2C temperatures
i2c_dev_t lm75_in, lm75_out;
i2cdev_init();
lm75_init_desc(&lm75_in, TMP1075_1_I2C_ADDR, I2C_MASTER_NUM, I2C_MASTER_SDA_IO, I2C_MASTER_SCL_IO);
i2cdev_init();
lm75_init_desc(&lm75_out, TMP1075_2_I2C_ADDR, I2C_MASTER_NUM, I2C_MASTER_SDA_IO, I2C_MASTER_SCL_IO);
float temp_in = 0.0;
float temp_out = 0.0;
char string_temp_in[20] = "I 00.0C"; // °
char string_temp_out[20] = "O 00.0C"; // °
// RTC
struct tm tm = {
.tm_sec = 0, .tm_min = 0, .tm_hour = 12,
.tm_mday = 1, .tm_mon = 0, .tm_year = 123, .tm_wday = 0, .tm_yday = 0
};
strptime(PRECOMPILED_TIMESTAMP, "%H:%M:%S", &tm);
struct timeval tv = {
.tv_sec = mktime(&tm),
.tv_usec = 0
};
settimeofday(&tv, NULL);
time_t current_time;
struct tm *timeinfo;
char string_time[16];
while (1) {
// time
current_time = time(NULL);
timeinfo = localtime(¤t_time);
snprintf(string_time, sizeof(string_time), "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
ssd1306_draw_string(ssd1306_dev, 32, 13, (const uint8_t *)string_time, 16, 1);
ssd1306_refresh_gram(ssd1306_dev);
// temp #1
// lm75_read_temperature(&lm75_in, &temp_in);
snprintf(string_temp_in, sizeof(string_temp_in), "I%5.1fC", temp_in);
ssd1306_draw_string(ssd1306_dev, 32, 29, (const uint8_t *)string_temp_in, 16, 1);
ssd1306_refresh_gram(ssd1306_dev);
// // temp #2
lm75_read_temperature(&lm75_out, &temp_out);
snprintf(string_temp_out, sizeof(string_temp_out), "O%5.1fC", temp_out);
ssd1306_draw_string(ssd1306_dev, 32, 45, (const uint8_t *)string_temp_out, 16, 1);
ssd1306_refresh_gram(ssd1306_dev);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
lm75_read_temperature
it works, so i can comment 1 and other works, and vice versa, but not the 2 at the same time, they have different addresses, a I2C scanner shows them both (0x48 and 0x49).
I tried with a 100ms pause between them.. nope.
If i add a print with esp_err_t everywhere, no errors at all
but whenever i remove one of the 2 commented out read
i get
␛[0;31mE (17752) i2c: i2c_master_cmd_begin(1490): i2c driver not installed␛[0m
␛[0;31mE (18752) i2c: i2c_master_cmd_begin(1490): i2c driver not installed␛[0m
␛[0;31mE (18752) i2c: i2c_driver_delete(451): i2c driver install error␛[0m
␛[0;31mE (18752) i2c: i2c_master_cmd_begin(1490): i2c driver not installed␛[0m
␛[0;31mE (18762) i2cdev: Could not read from device [0x48 at 0]: 259 (ESP_ERR_INVALID_STATE)␛[0m
␛[0;31mE (18762) lm75: lm75_read_temperature(): read_register16() failed: register: 0x0␛[0m
␛[0;31mE (18782) i2c: i2c_master_cmd_begin(1490): i2c driver not installed␛[0m
␛[0;31mE (18782) i2c: i2c_driver_delete(451): i2c driver install error␛[0m
␛[0;31mE (18792) i2c: i2c_master_cmd_begin(1490): i2c driver not installed␛[0m
␛[0;31mE (18802) i2cdev: Could not read from device [0x49 at 0]: 259 (ESP_ERR_INVALID_STATE)␛[0m
␛[0;31mE (18802) lm75: lm75_read_temperature(): read_register16() failed: register: 0x0␛[0m
please give me a clue or maybe another place to find the info.
thank you. Mic.