Датчики 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