Stránka 1 z 1

2 senzory HTU21D s displejem

Napsal: 20 dub 2020, 19:29
od Anthlon
Dobrý den,
prosím poraďte začátečníkovi...,
Mám úspěšně zprovozněn senzor HTU21D podle návodu https://navody.arduino-shop.cz/navody-k ... d-i2c.html v kombinaci s 1602 dislpejem rovněž podle návodu https://navody.arduino-shop.cz/zaciname ... splej.html, přičemž u displeje (protože jelito "ještě" nemám i2c obvod, tak to mám tím neúsporným zapojením přes 10 vodičů). (u toho jsem zachoval komunikaci přes seriový "monitor" v PC kdyby displej zlobil).

mám to na Arduino nano, a co bych chtěl, je přidat druhý senzor HTU21D, pokud možno přímo, a vypisovat tímpádem dvojí hodnoty oproti tomuto výchozímu programu. O výpis na displej popřípadě do PC se postarám posléze, zajímá mě zapojení a ošetření v programu pokud to je takto možné.

Aktuální kód:

Kód: Vybrat vše

#include <SparkFunHTU21D.h>
#include <Wire.h>
#include <LiquidCrystal.h> // knihovna pro LCD displej

// inicializace senzoru z knihovny
HTU21D mujHTU;

// inicializace pinu, lze vyměnit za jiné volné
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
              // komunikace po sériové lince rychlostí 9600 baud
              Serial.begin(9600);
              // zahájení komunikace se senzorem
              mujHTU.begin();

              // nastavení počtu znaků a řádků LCD, zde 16x2
              lcd.begin(16, 2);
              // vytisknutí hlášky na první řádek
              lcd.print("Mereni Teploty");
              // nastavení kurzoru na první znak, druhý řádek
              // veškeré číslování je od nuly, poslední znak je tedy 15, 1
              // problik displeje při startu
              lcd.setCursor ( 0, 0 );
              lcd.print("-*-*-*-*-*-*-*-*");
              lcd.setCursor ( 0, 1 );
              lcd.print("*-*-*-*-*-*-*-*-");
              delay(1000);
              lcd.setCursor ( 0, 0 );
              lcd.print("*-*-*-*-*-*-*-*-");
              lcd.setCursor ( 0, 1 );
              lcd.print("-*-*-*-*-*-*-*-*");
              delay(1000);
              lcd.clear();               
              }

void loop() {
  // načtení informací o teplotě a vlhkosti
  // do proměnných
  float teplota = mujHTU.readTemperature();
  float vlhkost = mujHTU.readHumidity();
  if (teplota > 125 | vlhkost > 100) {
    Serial.println("Chyba komunikace se senzorem HTU21D!");
    lcd.print("Chyba HTU21D!");
    delay(2000);
  }
  else {
    // vytištění naměřených údajů, 1 ve výpisu označuje
    // počet desetinných míst
    lcd.clear();
    Serial.print("HTU21D | Teplota: ");
    Serial.print(teplota, 1);
      lcd.setCursor ( 0, 0 );
      lcd.print("Teplota: ");
      lcd.print(teplota,1);
          
    Serial.print(" st C | ");   
  
    Serial.print("Vlhkost: ");
    Serial.print(vlhkost, 1);
      lcd.setCursor ( 0, 1 );
      lcd.print("Vlhkost: ");
      lcd.print(vlhkost,1);
    Serial.print("%");
      lcd.print("%");
    Serial.println();
  }
  // pauza 0,5 sekundy mezi výpisy
  delay(500);
}

Re: 2 senzory HTU21D s displejem

Napsal: 20 dub 2020, 21:08
od ArduXPP
HTU21D má od výrobce danou na pevno adresu I2C, takže jestli MCU nemá dvě rozdílná I2C, tak to nebude možné.

Re: 2 senzory HTU21D s displejem

Napsal: 20 dub 2020, 22:49
od martinius96
Ak máš 2 zariadenia s rovnakou I2C adresou, môžeš použiť I2C Multiplexer.
Avšak keď si začiatočník, pravdepodobne by to bolo na teba asi zložitejšie...
Bližšie to môžeš vidieť vo videu: https://www.youtube.com/watch?v=CSQEsQeCEAY

Re: 2 senzory HTU21D s displejem

Napsal: 21 dub 2020, 08:02
od Anthlon
martinius96 píše:
20 dub 2020, 22:49
Ak máš 2 zariadenia s rovnakou I2C adresou, môžeš použiť I2C Multiplexer.
Avšak keď si začiatočník, pravdepodobne by to bolo na teba asi zložitejšie...
Bližšie to môžeš vidieť vo videu: https://www.youtube.com/watch?v=CSQEsQeCEAY
Děkuju za utvrzení, myslel jsem si to, zároveň až po postu jsem se dočetl někde v eshopu, kde to bylo vyloženě u negativ věci, že se dá použit pouze jeden. Multiplexer principem chápu, ještě jsem jej fyzicky nepoužíval.

Přičemž multiplexer bude asi dávat větší smysl, jak finančně tak rozměrově hádám.

narazil jsem ještě na tento "příklad" ale nechápu ho :-D hlavně nevím kdybych to jenom okopíroval, tak s těmi senzory na A0 zapojit první SDA a na A2 zapojit druhé SDA? (krom napájení, to je asi jasnéé)...:

Kód: Vybrat vše

This is an Arduino library for SHT21 & HTU21D Digital Humidity & Temperature Sensor

Adapted for Multiple Sensors with no way to change device address.........
Pins, any you have spare on your ESP8266, But NOT A0 or D16(D0 Node)

The devices can share a Clock pin but not the data pin if they share an address.....
In this example I have used...(I only have 3 spare SHT21's)

pin 5 for SCL 
Pin 0 for SDA Bus 0
Pin 2 for SDA Bus 1
Pin 4 for SDA Bus 2

Written by enjoyneering79
Adapted Jan 2017

These sensors use I2C to communicate, 2 pins are required to interface

Connect HTU21D to pins :  SDA  SCL
Uno, Redboard, Pro:       A4   A5
Mega2560, Due:            20   21
Leonardo:                 2    3



BSD license, all text above must be included in any redistribution
*/
/**************************************************************************/

#include <Wire.h>
#include "HTU21D.h"


HTU21D myHTU21D;


int flip=0;


void setup()
{
 
  Serial.begin(115200);
  //Serial.set_tx (2);
  Serial.println(F(""));
  delay(10);
  Wire.begin(4,5);  
  delay(250);
  while (myHTU21D.begin() != true)
  {
    Serial.println(F("HTU21D sensor is not present"));
    delay(5000);
  }
  
  Serial.println(F("HTU21D sensor is present"));
}

void loop()
{
  if(flip==0){
    flip=1;
    delay(250);
    Wire.begin(0, 5);
    delay(100); 
    myHTU21D.begin();  
    delay(250);
    Serial.println(F("Sensor Bus 0"));
  }else if (flip==1){
    flip=2;
    delay(250);
    Wire.begin(2, 5);
    delay(100); 
    myHTU21D.begin();  
    delay(250);
     Serial.println(F("Sensor Bus 1"));    
  }else{
    flip=0;
    delay(250);
    Wire.begin(4, 5);
    delay(100); 
    myHTU21D.begin();  
    delay(250);
     Serial.println(F("Sensor Bus 2"));    
  }
  Serial.println(F(""));
  Serial.println(F("<<DEMO: Default settings, %RH: 12Bit, Temperature - 14Bit>>"));
 
  Serial.println(F(""));
  Serial.print(F("Compensated Humidity: "));
  Serial.print(myHTU21D.readCompensatedHumidity());
  Serial.println(F(" +-2%RH     in range 0%RH - 100%RH at tmp. range 0deg.C - 80deg.C"));

  Serial.println(F(""));
  Serial.print(F("Temperature: "));
  Serial.print(myHTU21D.readTemperature());
  Serial.println(F(" +-0.5 deg.C"));

  Serial.println(F(""));
  Serial.println(F("\r\n\r\n"));
  delay(5000);
}

Re: 2 senzory HTU21D s displejem

Napsal: 21 dub 2020, 22:46
od afilip
Tohle jsem nikdy neviděl, ani nezkoušel. Muselo by být společné napájení, GND a SCL, což jsou hodiny. SDA je datový signál, a je napojený každý na jiný pin. V podstatě to můžeš vyzkoušet klidně i s jedním HTU21D (pokud oba nemáš k dispozici), a mohlo by to fungovat.