Skocz do zawartości

Arduino i alarm z wykorzystaniem czujnika temeratury DS18B20


Chris18404

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

#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
Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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ę}
    }
}

 

Link do komentarza
Share on other sites

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ć 😕  

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.