• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Automatyczne odczytywanie trzech DS18b20
#1
Witam. Mam kod który działa. Problem jest taki że jak chcę podłączyć inny DS18b20 to muszę go odczytać i wpisać adres do projektu. Może ktoś pomoże przerobić aby nie trzeba było tego robić za każdym razem jak wymieniam czujnik.
Mam jeszcze takie pytanie czy można podłączyć każdy z czujników pod inny pin? 
Oto początek kodu bo chyba to ma znaczenie? 

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Rotary.h>
#include <DS3231.h>
#include <EEPROM.h> 

DS3231 clock;
RTCDateTime dt, lastdt, setdt;

typedef struct czasT_ {
  byte godz;
  byte minuta;
};

czasT_ czasy[4];
czasT_ tmpczasy[4];

#define ONE_WIRE_BUS 5 // Pin OneWire
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//DeviceAddress DS_NR1, DS_NR2, DS_NR3;

DeviceAddress DS_NR1 = { 0x28, 0xAD, 0xD4, 0x76, 0xE0, 0x01, 0x3C, 0xF6 }; // Tu wpisać adresy czujników
DeviceAddress DS_NR2 = { 0x28, 0x4D, 0x1C, 0x76, 0xE0, 0x01, 0x3C, 0xC3 }; // do szukania adresów program OneWireSearch z przykładów DallasTemperature
DeviceAddress DS_NR3 = { 0x28, 0xB0, 0xBF, 0x76, 0xE0, 0x01, 0x3C, 0x86 };

#define ON  LOW
#define OFF HIGH

#define PINA 2      // Pin A enkodera (CLK)
#define PINB 3    // Pin B enkodera (DT)
#define PINSW 4    // Pin SW enkodera (SW)

#define RELAY_1 8  // Pin przekaźnika 1
#define RELAY_2 9  // Pin przekaźnika 2

#define PIN_X1 11  // Pin X1
#define PIN_X2 12  // Pin X2

#define BUZZPIN 10  // Pin buzzera alarmu

#define MIN_CWU 25  // Minimalna temperatura CWU
#define MAX_CWU 70  // Maksymalna tempearatua CWU
#define HISTEREZA 5

#define DEBOUNCE_TIME 20 // debauncing przycisku 20 ms
#define TEMP_TIME 5000  // 5s czas pomiędzy odczytami temperatury
#define MENU_TIME 15000  // 5s po tym czasie wraca automatycznie do ekranu głównego
#define HOLD_TIME 5000 // 10s czas przytrzymania przycisku by wejśc w menu
#define RELAY1_OFF_TIME 120000 // 2 min
#define LCD_OFF_TIME 300000 // 5 min czas wyłaczenia podświetlenia

Rotary enkoder = Rotary(PINA, PINB);

long int Time = 0;
long int tTime = 0;
long int mTime = 0;
long int rTime = 0;
long int pTime = 0;
long int eTime = 0;

byte TempCWU = 50;
byte tmp = 50;

byte opcje = 0;
byte poz = 1;
byte lastpoz = 1;
byte E2poz = 1;
byte E3poz = 1;
byte E4poz = 1;

bool swPressed = false;
bool flag = false;
bool tflag = false;
bool eflag = true;
bool s10 = false;
bool p2minOff = false;
bool sysOFF = false;

//LiquidCrystal_I2C lcd(0x27,20,4);
LiquidCrystal_I2C lcd(0x27,20,4);
//LiquidCrystal_I2C lcd2(0x26,16,2);

uint8_t customChar[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000};

float temp1C = 0;
float temp2C = 0;
float temp3C = 0;
float lastT1 = 0;
float lastT2 = 0;
float lastT3 = 0;

uint16_t zakresTmp, zakres1, zakres2, zakres3, zakres4;

unsigned long lastDebounceTime = 0;
uint8_t debounceDelay = 50; // debouncing - opóźnienie i pozbycie się drganai styków w przyciskach

void saveconfig(){
  EEPROM.write(0,TempCWU);



Pozdrawiam
 
Odpowiedź
#2
Możesz czytać adresy czujników bezpośrednio przed odczytem temperatury.
Zamiast tego:
Kod:
DeviceAddress DS_NR1 = { 0x28, 0xAD, 0xD4, 0x76, 0xE0, 0x01, 0x3C, 0xF6 }; // Tu wpisać adresy czujników
DeviceAddress DS_NR2 = { 0x28, 0x4D, 0x1C, 0x76, 0xE0, 0x01, 0x3C, 0xC3 }; // do szukania adresów program OneWireSearch z przykładów DallasTemperature
DeviceAddress DS_NR3 = { 0x28, 0xB0, 0xBF, 0x76, 0xE0, 0x01, 0x3C, 0x86 };
 
Daj to:

Kod:
oneWire.search(DS_NR1);
oneWire.search(DS_NR2);
oneWire.search(DS_NR3);

Można też zrobić to lepiej i obsłużyć brak jakiegoś czujnika:

Kod:
if (!oneWire.search(DS_NR1)) funkcjaObslugiBledu(DS_NR1);
if (!oneWire.search(DS_NR2)) funkcjaObslugiBledu(DS_NR2);
if (!oneWire.search(DS_NR3)) funkcjaObslugiBledu(DS_NR3);

Dla trzech czujników jeszcze to przejdzie, ale dla większej ilości lepiej to zrobić na tablicy.

Możesz oczywiście nie korzystać z adresów czujników i zrobić to na ich indeksach.

Kod:
for (int i = 0; i < 3; i++) {;
    jakasZmienna[i] = sensors.getTempCByIndex(i);
  }

Albo:

Kod:
for (int i = 0; i < sensors.getDeviceCount(); i++) {;
    jakasZmienna[i] = sensors.getTempCByIndex(i);
  }

Oczywiście, można podłączyć każdy czujnik pod inny pin. Jest to opisane w przykładach do biblioteki.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości