Датчики SI 7021 есть проблемы с использованием более 1 шт

maxbarich
Offline
Зарегистрирован: 31.05.2013

Приветствую , поставили задачу использовать 3 датчика si 7021 , но так как у них адрес один и изменить не возможно, я использовал транзисторные ключи , и отключаю питание на датчик после его опроса и естественно включаю при опросе . Проблема появилась в том что МК начинает виснуть , по крайне мере текст на экране , при подключенных 3 датчиках . Если подключить один датчик то все работает , если подключить два датчика , при нагреве одного более +30 градусов начинает виснуть МК , как это связано от нагрева я не понимаю. Может кто что посоветует как решить проблему. 

#include <Adafruit_BMP280.h>
#include <SPI.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Si7021.h>
#include <Adafruit_Sensor.h>
//#include <avr/wdt.h>


LiquidCrystal_I2C lcd(0x27, 20, 4); // Для экрана 20х4 (четырехстрочный) 
//LiquidCrystal_I2C lcd(0x27, 16, 2); // Для экрана 16х2 (двухстрочный)
//Adafruit_Si7021 sensor = Adafruit_Si7021();
const int analogInPin = A0;
int sensorValue = 0; 
int raz = 2; //  датчик раздевалки 
int sup = 3; // датчик сауны верх 
int sdown = 4; // дачтик сауны низ

Adafruit_BMP280 bme;
//Adafruit_BMP280 bme;



uint8_t bukva_B[8] = {B11110, B10000, B10000, B11110, B10001, B10001, B11110};
uint8_t bukva_Ya[8] = {B01111, B10001, B10001, B01111, B00101, B01001, B10001};
uint8_t bukva_I[8] = {0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11};
uint8_t bukva_i[8] = {B00000,B00000,B01001,B01001,B01011,B01101,B01001,B00000};
uint8_t bukva_L[8] = {0x3, 0x7, 0x5, 0x5, 0xD, 0x9, 0x19};
uint8_t bukva_l[8] = {B00000,B00000,B00011,B00101,B00101,B00101,B01001,B00000};
uint8_t bukva_ZH[8] = {B10101, B10101, B10101, B11111, B10101, B10101, B10101};//Ж
uint8_t bukva_myg[8] = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B0000};
uint8_t bukva_P[8] = {0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};
uint8_t bukva_Y[8] = {B10001, B10001, B10001, B01010, B00100, B01000, B10000};
uint8_t bukva_F[8] = {B01110,B10101,B10101,B01110,B00100,B00100,B00100,B00000};
uint8_t bukva_Z[8] ={ B11111,B00001,B00010,B00100,B00010,B00001,B11111,B00000};
uint8_t bukva_z[8] ={B00000,B00000,B01111,B00001,B00011,B00001,B01111,B00000}; //з
uint8_t bukva_D[8] = {B01111, B00101, B00101, B01001, B10001, B11111, 0x11};
uint8_t bukva_d[8] = {B00000,B00000,B00011,B00101,B00101,B01111,B01001,B00000};//д
uint8_t bukva_C[8] = {B00111,B00101,B00111,B00000,B00000,B00000,B00000};
uint8_t bukva_bI[8] = {B10001,B10001,B10001,B11101,B10101,B10101,B11101,B00000};




void setup() 
{ 
 // lcd.backlight();
  Wire.begin();
  lcd.init();   
  
  pinMode(raz, OUTPUT); 
  pinMode(sup, OUTPUT);
  pinMode(sdown, OUTPUT);
  pinMode(13, OUTPUT);

  digitalWrite(raz, LOW);
  digitalWrite(sup, LOW);
  digitalWrite(sdown, LOW);
  //wdt_enable(WDTO_8S);
}

void loop() {
  
  //lcd.backlight();
  //lcd.clear();
  digitalWrite(13, HIGH);  
  delay(500);            
  digitalWrite(13, LOW);    
  
 
//билиотека для вывода букв

lcd.backlight();
lcd.createChar(1,bukva_P);lcd.createChar(2,bukva_Ya);lcd.createChar(3,bukva_I);lcd.createChar(4,bukva_Z);
lcd.createChar(5,bukva_D);lcd.createChar(6,bukva_ZH);lcd.createChar(7,bukva_L);
lcd.createChar(8,bukva_myg);



//Заголовок первой заставки "-Парная-" 
{
  
lcd.clear();
lcd.setCursor(6,0);
lcd.print("-");lcd.write(1);lcd.print("APHA");lcd.write(2);lcd.print("-");


                                //Вывод информации датчиков\\
                // Температура в сауне верх\\ 
digitalWrite(sup, HIGH); //вкл питание датчика 
delay(100);
Adafruit_Si7021 sensor = Adafruit_Si7021(); // инициализация датчика 
sensor.begin(); 
lcd.setCursor(0,1);
lcd.print("T.BEPX:");// lcd.print("H"); lcd.write(3);lcd.write(4);lcd.print(":");
lcd.setCursor(7,1);
lcd.print(sensor.readTemperature(),0);lcd.print("C"); // выводим значения температуры на экран 
                //Влажность в сауне верх\\
lcd.setCursor(0,2);
lcd.print("B"); lcd.write(7); lcd.print("A"); lcd.write(6); lcd.print("HOCT"); lcd.write(8); lcd.print(":");
lcd.setCursor(10,2);
lcd.print(sensor.readHumidity(),0);lcd.print("%");// выводим значения влажности  на экран 
delay(50);
digitalWrite(sup, LOW); //выкл питание датчика 
//wdt_reset();  // сброс сторожевого таймера

                // Температура в сауне низ\\
{
digitalWrite(sdown, HIGH);
delay(100);
Adafruit_Si7021 sensor = Adafruit_Si7021();
sensor.begin();
lcd.setCursor(12,1);
lcd.print("H"); lcd.write(3);lcd.write(4);lcd.print(":");
lcd.setCursor(16,1);
lcd.print(sensor.readTemperature(), 0);lcd.print("C");
                //Влажность в сауне низ\\
delay(50);
lcd.setCursor(14,2);
lcd.print("B2:");lcd.print(sensor.readHumidity(),0);lcd.print("%");
digitalWrite(sdown, LOW);

}

                  //Вывод информации CO2\\
delay(100);
sensorValue = analogRead(analogInPin);
lcd.setCursor(0,3);
lcd.print("BO");lcd.write(4);lcd.write(5);lcd.print("yX-CO2:");
lcd.setCursor(13,3);
lcd.print(sensorValue);lcd.print("PPm");


//wdt_reset();  // сброс сторожевого таймера

delay(5000);

//wdt_reset();  // сброс сторожевого таймера
//билиотека для вывода букв
lcd.createChar(1,bukva_P);lcd.createChar(2,bukva_I);lcd.createChar(3,bukva_D);lcd.createChar(4,bukva_bI);
lcd.createChar(5,bukva_Y);lcd.createChar(6,bukva_ZH);lcd.createChar(7,bukva_L);
lcd.createChar(8,bukva_myg);

//Заголовок второй заставки " -Комната отдыха- " 

lcd.clear();
lcd.setCursor(2,0);
lcd.print("-KOMHATA OT");lcd.write(3);lcd.write(4);lcd.print("XA-");


// Вывод информации датчиков температуры 
{
digitalWrite(raz, HIGH);
delay(100); 
Adafruit_Si7021 sensor = Adafruit_Si7021();
sensor.begin();
//Adafruit_BMP280 bme;
//bme.begin();
lcd.setCursor(0,1);
lcd.print("TEM"); lcd.write(1); lcd.print("EPAT"); lcd.write(5); lcd.print("PA:");
lcd.setCursor(15,1);
//lcd.print(bme.readTemperature(), 0);lcd.print("C");
lcd.print(sensor.readTemperature(), 0);lcd.print("C");


// Вывод информации датчиков влажности 
 //Adafruit_Si7021 sensor = Adafruit_Si7021();
 //sensor.begin();
 lcd.setCursor(0,2);
 lcd.print("B"); lcd.write(7); lcd.print("A"); lcd.write(6); lcd.print("HOCT"); lcd.write(8); lcd.print("  :");
 lcd.setCursor(15,2);
 lcd.print(sensor.readHumidity(),0);lcd.print("%");
 digitalWrite(raz, LOW);
 delay(100);
} 
 //Вывод информации атмосферного давления 
 digitalWrite(raz, HIGH);
 delay(200);
 Adafruit_BMP280 bme;
 bme.begin();
 lcd.setCursor(0,3);
 lcd.print ("AT.");lcd.write(3);lcd.print("AB");lcd.write(7);lcd.print("EH");lcd.write(2);lcd.print("E: ");
 lcd.setCursor(13,3);
 lcd.print(round(bme.readPressure()/133.3));
 lcd.print(" Pa");
 digitalWrite(raz, LOW);
 //wdt_reset();  // сброс сторожевого таймера
 delay(5000);
 //wdt_reset();  // сброс сторожевого таймера
 
 
 }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

сдается мне, ничего вы с ними не сможете сделать.  На si 7021 в инете вылито немало грязи именно за то, что у них фиксированный адрес. Насколько я понял, простого решения нет. Либо использовать i2C мультиплексор, либо взять другие датчики.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

СD 4053 и им подобные.

 

maxbarich
Offline
Зарегистрирован: 31.05.2013

Спасибо за ответ, с адресом конечно подстава , я когда начал собирать не думал что так получится . Почитал по другим форумам , тоже ничего путевого кроме как мультиплексора не найти 

maxbarich
Offline
Зарегистрирован: 31.05.2013

Спасибо за ответ, да как вариант , но уже заказал другие датчики , термопары , мужик в парной до +140 жарит , si7021 не справляются ))))

sadman41
Offline
Зарегистрирован: 19.10.2016

maxbarich пишет:

Спасибо за ответ, с адресом конечно подстава , я когда начал собирать не думал что так получится . Почитал по другим форумам , тоже ничего путевого кроме как мультиплексора не найти 

Просто для информации: SoftwareI2CLibrary

alex_r61
Offline
Зарегистрирован: 20.06.2012

Просто для информации: ATMega168/328PB <<Two Byte-Oriented 2-Wire Serial Interfaces (Philips I2C Compatible)>>

http://www.microchip.com/wwwproducts/en/ATMEGA328PB