Датчики SI 7021 есть проблемы с использованием более 1 шт
- Войдите на сайт для отправки комментариев
Ср, 09/08/2017 - 14:27
Приветствую , поставили задачу использовать 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(); // сброс сторожевого таймера
}
}
сдается мне, ничего вы с ними не сможете сделать. На si 7021 в инете вылито немало грязи именно за то, что у них фиксированный адрес. Насколько я понял, простого решения нет. Либо использовать i2C мультиплексор, либо взять другие датчики.
СD 4053 и им подобные.
Спасибо за ответ, с адресом конечно подстава , я когда начал собирать не думал что так получится . Почитал по другим форумам , тоже ничего путевого кроме как мультиплексора не найти
Спасибо за ответ, да как вариант , но уже заказал другие датчики , термопары , мужик в парной до +140 жарит , si7021 не справляются ))))
Спасибо за ответ, с адресом конечно подстава , я когда начал собирать не думал что так получится . Почитал по другим форумам , тоже ничего путевого кроме как мультиплексора не найти
Просто для информации: SoftwareI2CLibrary
Просто для информации: ATMega168/328PB <<Two Byte-Oriented 2-Wire Serial Interfaces (Philips I2C Compatible)>>
http://www.microchip.com/wwwproducts/en/ATMEGA328PB