Skocz do zawartości

Arduino i alarm z wykorzystaniem czujnika temeratury DS18B20


Pomocna odpowiedź

Napisano (edytowany)

Cześć, mam pytanko 🙂

Chcę zrobić  alarm pieca C.O z wykorzystaniem czujnika temeratury DS18B20. Mam buzzer do wydawania dzwięku.

Wstępnie zaprogramowałem Arduino uno R3 tak że gdy temperatura będzie powyżej 22 stopni dioda czerwona zacznie migać . Jesli temperatura będzie poniżej 22 stopni świeci się cały czas dioda biała. Buzzer tez włacza się gdy temperatura jest powyżej 22stopni.

 Czujnik mam w pinie 2.  Diodę w pinie 12. Buzzer wp inie 8.     Przełacznik w pinie 9.

Chce dodać przełącznik który po naciśnięciu wyłaczy buzzer na 10 minut.

Będę wdzięczny za pomoc.


#include <OneWire.h> 
#include <DallasTemperature.h>
/********************************************************************/
// przewód podłączony do pinu 2
#define ONE_WIRE_BUS 2 

const int buzzerPin=8;

OneWire oneWire(ONE_WIRE_BUS);


// odniesienie oneWire do temperatury w Dallas.
DallasTemperature sensors(&oneWire);
/********************************************************************/ 
void setup(void) 
{ 
  pinMode(13,OUTPUT); //dioda podłączona do pinu 13
  pinMode(12,OUTPUT); //dioda podłączona do pinu 13
  pinMode(buzzerPin,OUTPUT);
  
  // uruchom port szeregowy
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 //  Uruchom bibliotekę
 sensors.begin(); 
} 
void loop(void) 
{ 
  Serial.print(" Odczyt temperatury:"); 
 sensors.requestTemperatures(); // Polecenie, aby uzyskać odczyty temperatury
 Serial.println("Wykonany"); 
 Serial.print("Aktulna temperatura: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 delay(500); 


if (sensors.getTempCByIndex(0) > 22)  //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  {
  tone(buzzerPin,600);
  delay(1000);
   } 
else
{
  noTone(buzzerPin);
   }


 if (sensors.getTempCByIndex(0) > 22) { //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  digitalWrite(13, HIGH); //Włącz diodę
    delay(150);
    digitalWrite(13, LOW); //Wyłącz diodę
    delay(40);
    digitalWrite(12, LOW); //Wyłącz diodę}
    } 
    else
    { digitalWrite(13, LOW); //Wyłącz diodę
    digitalWrite(12, HIGH); //Wyłącz diodę}
    }
}

 

 

Edytowano przez Chris18404

Nad takim okienkiem gdzie wprowadzasz zawartość posta masz taki guzik "wstaw kod". Nie musisz go używać, ale wtedy musisz wziąć pod uwagę to, że nikt tego nie będzie czytać.

To Ty potrzebujesz pomocy i powinieneś w maksymalnym stopniu ułatwić nam jej udzielenie.

1 godzinę temu, ethanak napisał:

Nad takim okienkiem gdzie wprowadzasz zawartość posta masz taki guzik "wstaw kod". Nie musisz go używać, ale wtedy musisz wziąć pod uwagę to, że nikt tego nie będzie czytać.

To Ty potrzebujesz pomocy i powinieneś w maksymalnym stopniu ułatwić nam jej udzielenie.

Ok. Poprawiłem.

(edytowany)
#include <OneWire.h> 
#include <DallasTemperature.h>
/********************************************************************/
// przewód podłączony do pinu 2
#define ONE_WIRE_BUS 2 

const int buzzerPin=8;

OneWire oneWire(ONE_WIRE_BUS);


// odniesienie oneWire do temperatury w Dallas.
DallasTemperature sensors(&oneWire);
/********************************************************************/ 
void setup(void) 
{ 
  pinMode(13,OUTPUT); //dioda podłączona do pinu 13
  pinMode(12,OUTPUT); //dioda podłączona do pinu 13
  pinMode(buzzerPin,OUTPUT);
  
  // uruchom port szeregowy
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 //  Uruchom bibliotekę
 sensors.begin(); 
} 
void loop(void) 
{ 
  Serial.print(" Odczyt temperatury:"); 
 sensors.requestTemperatures(); // Polecenie, aby uzyskać odczyty temperatury
 Serial.println("Wykonany"); 
 Serial.print("Aktulna temperatura: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 delay(500); 
  
if (digitalRead(guzik) == LOW) {
  delay(500);
  stan = 0;
  last = millis();
  }
if (millis() - last > 600000UL) {
  stan = 1;
  }
  

if (sensors.getTempCByIndex(0) > 22 && stan == 1)  //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  {
  tone(buzzerPin,600);
  delay(1000);
   } 
else
{
  noTone(buzzerPin);
   }


 if (sensors.getTempCByIndex(0) > 22) { //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  digitalWrite(13, HIGH); //Włącz diodę
    delay(150);
    digitalWrite(13, LOW); //Wyłącz diodę
    delay(40);
    digitalWrite(12, LOW); //Wyłącz diodę}
    } 
    else
    { digitalWrite(13, LOW); //Wyłącz diodę
    digitalWrite(12, HIGH); //Wyłącz diodę}
    }
}

Ogolnie to duzo tych delajow...poczytaj i pocwicz na millis() i swiat stanie sie lepszy i jakby mniej opozniony...😉 no ale z grubsza to powinno robic to co chcesz...

Edytowano przez farmaceuta
6 godzin temu, farmaceuta napisał:

#include <OneWire.h> 
#include <DallasTemperature.h>
/********************************************************************/
// przewód podłączony do pinu 2
#define ONE_WIRE_BUS 2 

const int buzzerPin=8;

OneWire oneWire(ONE_WIRE_BUS);


// odniesienie oneWire do temperatury w Dallas.
DallasTemperature sensors(&oneWire);
/********************************************************************/ 
void setup(void) 
{ 
  pinMode(13,OUTPUT); //dioda podłączona do pinu 13
  pinMode(12,OUTPUT); //dioda podłączona do pinu 13
  pinMode(buzzerPin,OUTPUT);
  
  // uruchom port szeregowy
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 //  Uruchom bibliotekę
 sensors.begin(); 
} 
void loop(void) 
{ 
  Serial.print(" Odczyt temperatury:"); 
 sensors.requestTemperatures(); // Polecenie, aby uzyskać odczyty temperatury
 Serial.println("Wykonany"); 
 Serial.print("Aktulna temperatura: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 delay(500); 
  
if (digitalRead(guzik) == LOW) {
  delay(500);
  stan = 0;
  last = millis();
  }
if (millis() - last > 600000UL) {
  stan = 1;
  }
  

if (sensors.getTempCByIndex(0) > 22 && stan == 1)  //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  {
  tone(buzzerPin,600);
  delay(1000);
   } 
else
{
  noTone(buzzerPin);
   }


 if (sensors.getTempCByIndex(0) > 22) { //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  digitalWrite(13, HIGH); //Włącz diodę
    delay(150);
    digitalWrite(13, LOW); //Wyłącz diodę
    delay(40);
    digitalWrite(12, LOW); //Wyłącz diodę}
    } 
    else
    { digitalWrite(13, LOW); //Wyłącz diodę
    digitalWrite(12, HIGH); //Wyłącz diodę}
    }
}

Ogolnie to duzo tych delajow...poczytaj i pocwicz na millis() i swiat stanie sie lepszy i jakby mniej opozniony...😉 no ale z grubsza to powinno robic to co chcesz...

Dzięki za odpowiedź, jednak kod ma błędy. Gdzie zdefiniowany jest przycisk?

(edytowany)
Dnia 4.07.2021 o 13:05, Chris18404 napisał:

22 stopni dioda czerwona zacznie migać . Jesli temperatura będzie poniżej 22 stopni świeci

Dodaj jakąś histerezę, bo będzie ci oscylować wokół 22*

Może w ramach ciekawostki, albo wykorzystania potencjału czujnika - Dallasy mają 2 alarmy, w których ustawiasz niski i wysoki próg temperaturowy 🙂 Popatrz w kodzie na funkcje z dopiskiem alarm lub user: https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/DallasTemperature.h

Edytowano przez Gieneq
  • Lubię! 1
(edytowany)
Dnia 5.07.2021 o 22:14, farmaceuta napisał:

Panie...takie rzeczy to chyba sam sobie dopiszesz hmm?😉

#include <OneWire.h> 
#include <DallasTemperature.h>
/********************************************************************/
// przewód podłączony do pinu 2
#define ONE_WIRE_BUS 2 

const int buzzerPin=8;
const int guzikPin=7;
int stan = 0;
int last = 0;
OneWire oneWire(ONE_WIRE_BUS);


// odniesienie oneWire do temperatury w Dallas.
DallasTemperature sensors(&oneWire);
/********************************************************************/ 
void setup(void) 
{ 
  pinMode(13,OUTPUT); //dioda podłączona do pinu 13
  pinMode(12,OUTPUT); //dioda podłączona do pinu 13
  pinMode(buzzerPin,OUTPUT);
  
  // uruchom port szeregowy
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 //  Uruchom bibliotekę
 sensors.begin(); 
} 
void loop(void) 
{ 
  Serial.print(" Odczyt temperatury:"); 
 sensors.requestTemperatures(); // Polecenie, aby uzyskać odczyty temperatury
 Serial.println("Wykonany"); 
 Serial.print("Aktulna temperatura: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 delay(500); 
  
if (digitalRead(guzikPin) == LOW) {
  delay(500);
  stan = 0;
  last = millis();
  }
if (millis() - last > 600000UL) {
  stan = 1;
  }
  

if (sensors.getTempCByIndex(0) > 26 && stan == 1)  //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  {
  tone(buzzerPin,600);
  delay(1000);
   } 
else
{
  noTone(buzzerPin);
   }


 if (sensors.getTempCByIndex(0) > 26) { //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  digitalWrite(13, HIGH); //Włącz diodę
    delay(150);
    digitalWrite(13, LOW); //Wyłącz diodę
    delay(40);
    digitalWrite(12, LOW); //Wyłącz diodę}
    } 
    else
    { digitalWrite(13, LOW); //Wyłącz diodę
    digitalWrite(12, HIGH); //Wyłącz diodę}
    }
}

włącznik  ,stan oraz last zdefiniowałem za pomoca 'int" bardzo proszę o pomoc.

Teraz diody dobrze reagują na tempraturę ale buzzer się nie włącza.

Edytowano przez Chris18404
(edytowany)

Jeszcze dodaj 

pinMode(guzikPin, INPUT_PULLUP);

do setup()

I guzik podlaczasz tak ze jeden koniec do pinu ardu a drugi do gnd

I zmienna "stan" na wyjsciu musi miec wartosc 1...

A zmienna last ma byc typu 4-bajtowego czyli uint32_t

Edytowano przez farmaceuta

Zmieniłem i działa 🙂 jedynie=nie nie ustawiłem tego unit32_t bo nie wiem jak 😞

Chce dołożyć drugi buzzer aby było głośniej jednak nie załacza go , co robię źle?

 

#include <OneWire.h> 
#include <DallasTemperature.h>
/********************************************************************/
// przewód podłączony do pinu 2
#define ONE_WIRE_BUS 2 

const int buzzerPin=8;
const int buzzer=10;
const int guzikPin=7;
int stan = 1;
int last = 0;
OneWire oneWire(ONE_WIRE_BUS);


// odniesienie oneWire do temperatury w Dallas.
DallasTemperature sensors(&oneWire);
/********************************************************************/ 
void setup(void) 
{ 
  pinMode(13,OUTPUT); //dioda podłączona do pinu 13
  pinMode(12,OUTPUT); //dioda podłączona do pinu 13
  pinMode(buzzerPin,OUTPUT);
  pinMode(buzzer,OUTPUT);
  pinMode(guzikPin,INPUT_PULLUP);
  
  // uruchom port szeregowy
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 //  Uruchom bibliotekę
 sensors.begin(); 
} 
void loop(void) 
{ 
  Serial.print(" Odczyt temperatury:"); 
 sensors.requestTemperatures(); // Polecenie, aby uzyskać odczyty temperatury
 Serial.println("Wykonany"); 
 Serial.print("Aktulna temperatura: "); 
 Serial.print(sensors.getTempCByIndex(0)); 
 delay(500); 
  
if (digitalRead(guzikPin) == LOW) {
  delay(500);
  stan = 0;
  last = millis();
  }
if (millis() - last > 600000UL) {
  stan = 1;
  }
  

if (sensors.getTempCByIndex(0) > 26 && stan == 1)  //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  {
  tone(buzzerPin,800);
  delay(1000);
  tone(buzzer,100);
  delay(500);
  
   } 
else
{
  noTone(buzzerPin);
  noTone(buzzer);
   }


 if (sensors.getTempCByIndex(0) > 26) { //Jeśli czujnik wskaże temp >21 stopni Celcjusza
  digitalWrite(13, HIGH); //Włącz diodę
    delay(150);
    digitalWrite(13, LOW); //Wyłącz diodę
    delay(40);
    digitalWrite(12, LOW); //Wyłącz diodę}
    } 
    else
    { digitalWrite(13, LOW); //Wyłącz diodę
    digitalWrite(12, HIGH); //Wyłącz diodę}
    }
}

 

9 godzin temu, farmaceuta napisał:

Zamiast...


int last = 0;

Zmien na....


uint32_t last = 0;

Chodzi o zakresy liczbowe...w skrocie int miesci malutki zakres wzgledem uint32...i z int twoj program by nie dzialal

Dzięki wielkie, a jak dodać ten drugi buzzer bo za nic mi nie chcęsie załączyć 😕  

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...