Arduino, operacje na zmiennych od DS18B20.

Post Reply
pawelk
Posts: 27
Joined: Fri Nov 11, 2016 12:31 pm

Sat Dec 03, 2016 1:13 pm

Witam.
Arduino mega i 3 X DS18B20.
Wszystko działa świetnie, tylko chciałbym, aby po przekroczeniu temperatury na dwóch kanałach (powiedzmy 80stopni C.) załączył mi się przekaźnik.
Rozumiem że muszę pobrać zmienną i porównać ją z tymi moimi 80 stopniami, jak zmienna będzie większa to wysterować jakiś pin w arduino.
Tylko mam problem gdzie pobrać te zmienne? Czy one kryją się pod zmienną "t"? Jak próbuje w monitorze portu wyświetlić zmienną "t" to wyskakują mi odczyty z trzech Ds'ów, a ja potrzebuje pobrać i porównać tylko dwa.
Oto kod:

Code: Select all

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SuplaDevice.h>

/*
 * SUPLA DEVICE - ARDUINO - ETHERNET SHIELD & DS18B20 SENSOR
 * Author: Przemyslaw Zygmunt <przemek@supla.org>
 *
 * This example requires Dallas Temperature Control library installed. 
 * https://github.com/milesburton/Arduino-Temperature-Control-Library
 */

 
// Setup a oneWire instance
OneWire oneWire(24); // 24 - Pin number

// Pass oneWire reference to Dallas Temperature
DallasTemperature sensors(&oneWire);

// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
    
if ( sensors.getDeviceCount() > 0 )
{
sensors.requestTemperatures();
// t = sensors.getTempCByIndex(0);
int i = 0;
switch(channelNumber)
{
case 5:
i = 0;
break;
case 6:
i = 1;
break;
case 7:
i = 2;
break;

};


t = sensors.getTempCByIndex(i);
};

return t; 
}
void setup() {

  Serial.begin(9600);

  // Init DS18B20 library 
  sensors.begin();
  
  // Set temperature callback
  SuplaDevice.setTemperatureCallback(&get_temperature);
 
  // Replace the falowing GUID
  char GUID[SUPLA_GUID_SIZE] = {0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx};
  // with GUID that you can retrieve from https://www.supla.org/arduino/get-guid


  // Ethernet MAC address
  uint8_t mac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};

  /*
   * Having your device already registered at cloud.supla.org,
   * you want to change CHANNEL sequence or remove any of them,
   * then you must also remove the device itself from cloud.supla.org.
   * Otherwise you will get "Channel conflict!" error.
   */
    
  // CHANNEL0 - RELAY
  SuplaDevice.addRelay(44, true);           // 44 - Pin number where the relay is connected      
                                      // Call SuplaDevice.addRelay(44, true) with an extra "true" parameter 
                                      // to enable "port value inversion"
                                      // where HIGH == LOW, and LOW == HIGH   

  // CHANNEL1 - RELAY
  SuplaDevice.addRelay(45, true);           // 45 - Pin number where the relay is connected   

  // CHANNEL3 - TWO RELAYS (Roller shutter operation)
  SuplaDevice.addRollerShutterRelays(46,     // 46 - Pin number where the 1st relay is connected   
                                     47, true);    // 47 - Pin number where the 2nd relay is connected  

  // CHANNEL4 - Opening sensor (Normal Open)
  SuplaDevice.addSensorNO(A0); // A0 - Pin number where the sensor is connected
                               // Call SuplaDevice.addSensorNO(A0, true) with an extra "true" parameter
                               // to enable the internal pull-up resistor


  // CHANNEL5 - Opening sensor (Normal Open)
  SuplaDevice.addSensorNO(A1); // A1 - Pin number where the sensor is connected


  // CHANNEL6 - Thermometer DS18B20
  SuplaDevice.addDS18B20Thermometer();

SuplaDevice.addDS18B20Thermometer();
SuplaDevice.addDS18B20Thermometer();



  /*
   * SuplaDevice Initialization.
   * Server address, LocationID and LocationPassword are available at https://cloud.supla.org 
   * If you do not have an account, you can create it at https://cloud.supla.org/account/create
   * SUPLA and SUPLA CLOUD are free of charge
   * 
   */

  SuplaDevice.begin(GUID,              // Global Unique Identifier 
                    mac,               // Ethernet MAC address
                    "svr3.supla.org",  // SUPLA server address
                    xxx,                 // Location ID 
                    "xxxx");               // Location Password
    
}

void loop() {
  SuplaDevice.iterate();
}
User avatar
pzygmunt
Posts: 5663
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Mon Dec 05, 2016 8:52 am

t = sensors.getTempCByIndex(i);

if ( t > 80 ) {

// tu włączasz
} else {
// tu wyłączasz
};
pawelk
Posts: 27
Joined: Fri Nov 11, 2016 12:31 pm

Sun Dec 11, 2016 5:45 pm

Hej.
Przemku, teraz po przekroczeniu temperatury na jednym z wybranych termometrów dostaje stan wysoki na pinie 50, tylko jest problem bo dioda podłączona do tego pinu świeci bardo słabo, wydajność prądowa tego pinu jest taka mała, że nie mogę tym pinem wysterować modułu przekaźników.
Próbowałem na innym pinie i jest to samo. Co się dzieje? O czym zapomniałem?
Druga sprawa to, że chciałbym porównać dwie temperatury z DS i po porównaniu jeżeli t1 będzie większa od t2 wysterować przekaźnik.
Buduje dość rozbudowane sterowanie dwoma piecami, bramą, bojlerem, rgbw, oświetleniem itp Jak skończę to zamieszczę film :)
Zostały mi do rozwiązania chyba tylko te dwa w/w problemy ;)
Pozdrawiam

Code: Select all

OneWire oneWire(24); // 24 - Pin number


// Pass oneWire reference to Dallas Temperature
DallasTemperature sensors(&oneWire);

// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
    
if ( sensors.getDeviceCount() > 0 )
{
sensors.requestTemperatures();
// t = sensors.getTempCByIndex(0);
int i = 0;
switch(channelNumber)
{
case 5:
i = 0;
t = sensors.getTempCByIndex(i);
if ( t > 30 ) {
 

digitalWrite(50, HIGH);
} else {
digitalWrite(50, LOW);
}

break;
case 6:
i = 1;
break;
case 7:
i = 2;
break;
case 8:
i = 3;
break;
};


t = sensors.getTempCByIndex(i);
Serial.println(t);

};

return t; 
}
void setup() {

  Serial.begin(9600);


  // Init DS18B20 library 
  sensors.begin();
User avatar
nowy1
Posts: 322
Joined: Fri Jul 01, 2016 11:51 am
Location: Warszawa

Sun Dec 11, 2016 5:52 pm

pawelk wrote:Hej.
Przemku, teraz po przekroczeniu temperatury na jednym z wybranych termometrów dostaje stan wysoki na pinie 50, tylko jest problem bo dioda podłączona do tego pinu świeci bardo słabo, wydajność prądowa tego pinu jest taka mała, że nie mogę tym pinem wysterować modułu przekaźników.
Próbowałem na innym pinie i jest to samo. Co się dzieje? O czym zapomniałem?
Druga sprawa to, że chciałbym porównać dwie temperatury z DS i po porównaniu jeżeli t1 będzie większa od t2 wysterować przekaźnik.
Buduje dość rozbudowane sterowanie dwoma piecami, bramą, bojlerem, rgbw, oświetleniem itp Jak skończę to zamieszczę film :)
Zostały mi do rozwiązania chyba tylko te dwa w/w problemy ;)
Pozdrawiam

Code: Select all

OneWire oneWire(24); // 24 - Pin number


// Pass oneWire reference to Dallas Temperature
DallasTemperature sensors(&oneWire);

// DS18B20 Sensor read implementation
double get_temperature(int channelNumber, double last_val) {

    double t = -275;
    
if ( sensors.getDeviceCount() > 0 )
{
sensors.requestTemperatures();
// t = sensors.getTempCByIndex(0);
int i = 0;
switch(channelNumber)
{
case 5:
i = 0;
t = sensors.getTempCByIndex(i);
if ( t > 30 ) {
 

digitalWrite(50, HIGH);
} else {
digitalWrite(50, LOW);
}

break;
case 6:
i = 1;
break;
case 7:
i = 2;
break;
case 8:
i = 3;
break;
};


t = sensors.getTempCByIndex(i);
Serial.println(t);

};

return t; 
}
void setup() {

  Serial.begin(9600);


  // Init DS18B20 library 
  sensors.begin();

musisz zastosować tranzystor np BC817

tu masz pokazane jak to zrobić


download/file.php?id=171
pawelk
Posts: 27
Joined: Fri Nov 11, 2016 12:31 pm

Sun Dec 11, 2016 6:14 pm

Wydaje mi się, że to coś innego, bo po wgraniu

Code: Select all

void setup() {
  pinMode(50, OUTPUT); //Konfiguracja pinu 50 jako wyjście
}

 
void loop() {
  digitalWrite(50, HIGH); //Włączenie diody
  delay(1000); //Odczekanie 1 sekundy
  digitalWrite(50, LOW); //Wyłączenie diody
  delay(1000); //Odczekanie jednej sekundy
}
Pin ładnie steruje diodą i przekaźnikiem, może to chodzi o polecenie" pinMode(50, OUTPUT);" ?
W którym miejscu mam to wpisać?
User avatar
pzygmunt
Posts: 5663
Joined: Tue Jan 19, 2016 9:26 am
Location: Paczków
Contact:

Mon Dec 12, 2016 5:26 pm

Tam zawsze będziesz miał stan wysoki z taką samą wydajnością prądową. Tego się nie reguluje. Potrzebujesz więcej mocy to użyj dodatkowo tranzystor.
pawelk
Posts: 27
Joined: Fri Nov 11, 2016 12:31 pm

Mon Dec 12, 2016 6:54 pm

Chyba niejasno się wyraziłem, na pinie miałem stany nieustalone, po podpięciu oscyloskopu do tego pinu widać było "śmieci" i niepełne zasilanie, mimo minimalnego obciążenia pinu. Dodatkowo jak zapalała się dioda TX to na pinie 50 wzrastało napięcie. :shock:
Już sobie poradziłem, nie wiem czy to jest prawidłowe pod względem "programistycznym", ale działa ;)

Code: Select all

 double t = -275;
    double a = -275;
    double b = -275;
    
    
if ( sensors.getDeviceCount() > 0 )
{
sensors.requestTemperatures();
// t = sensors.getTempCByIndex(0);
int i = 0;
switch(channelNumber)
{
case 5:
i = 0;
a = sensors.getTempCByIndex(i);
if ( a > 28 ) {

digitalWrite(48, LOW);
} else {
digitalWrite(48, HIGH);
};



break;
case 6:
i = 1;
b = sensors.getTempCByIndex(i);
if ( b > 28 ) {

digitalWrite(49, LOW);
} else {
digitalWrite(49, HIGH);
};
break;
case 7:
i = 2;
break;
case 8:
i = 3;
break;
};

I w void setup:
pinMode(48, OUTPUT);
pinMode(49, OUTPUT);
Nie wiem co pomogło, ale działa :)
Post Reply