• 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
Dodanie BEEP
#1
Witam. Wykonałem sobie projekt sterownika pompy CO. W sumie hasa bez zarzutów ale chciałem dołożyć taki mały gadżet do tego ustrojstwa, a mianowicie sygnalizacje buzerem. W momencie załączenia pompy sterownik wyemituje dzwięk 2x beep, a przy wyłączeniu jeden beep. Szczerze to nie mam pojęcia jak to zrobić. Ostatnia próba zakończyła się na tym że jak osiągnoł temperaturę docelową to beepkał cały czas. Proszę o jakąś podpowiedź.

Kod:
#include <OneWire.h>
#include <DS18B20.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define ONE_WIRE_BUS 11
OneWire oneWire(ONE_WIRE_BUS);
DS18B20 sensors(&oneWire);
const int A=6;
const int B=7;
float tempz = 50;
byte address[8] = {0x28, 0x16, 0x5A, 0x1E, 0x7, 0x0, 0x0, 0x88};
float temperatura;
void setup()
{
 sensors.begin();
 pinMode(5,INPUT_PULLUP);
 pinMode(A, INPUT_PULLUP);
 pinMode(B, INPUT_PULLUP);
 pinMode(12,OUTPUT);
 lcd.begin(20, 4);
 lcd.backlight();
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("T.Pieca     ~");
 lcd.setCursor(0,2);
 lcd.print("Stan pompy  ~");
 lcd.setCursor(0,3);
 lcd.print("Start pompy ~");
}
boolean stan=0;
void loop()
{
   if(digitalRead(A)==LOW){tempz++;}
   if(digitalRead(B)==LOW){tempz--;}
   lcd.setCursor(14,3);
   lcd.print(tempz);

   if(digitalRead(5)==LOW)
   {
 delay(20);
 stan=!stan;
 digitalWrite(12,stan);
 while(digitalRead(5)==LOW);
 delay(20);
   }
   if (sensors.available())
 {
 temperatura = sensors.readTemperature(address);
 sensors.request(address);
 }
lcd.setCursor(14,0);
lcd.print(temperatura);


if (temperatura >=tempz){digitalWrite(12,HIGH);
 lcd.setCursor(14,2);
 lcd.print("PRACA");
}
if (temperatura<=tempz -6){digitalWrite(12,LOW);
 lcd.setCursor(14,2);
 lcd.print("STOP ");
}

}
 
Odpowiedź
#2
Proponuję zammienić absolutne adresy pinów i krótkie nazwy(A,B) na nazwy które mówią co dany pin robi. Program przez to nie zajmie więcej miejsca w pamięci ale za to będzie bardziej czytelny. Docenisz to jak do niego siądziesz po długim czasie.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
(22-03-2017, 09:00)namok napisał(a): Proponuję zammienić absolutne adresy pinów i krótkie nazwy(A,B) na nazwy które mówią co dany pin robi. Program przez to nie zajmie więcej miejsca w pamięci  ale za to będzie bardziej czytelny.  Docenisz to jak do niego siądziesz po długim czasie.

Tu masz rację bo musiałem trochę przypomnieć sobie troszkę o co tam chodziło, ale co to ma do dołożenia sygnalizatora dzwiękowego???
 
Odpowiedź
#4
(22-03-2017, 14:11)ferdricco napisał(a): Tu masz rację bo musiałem trochę przypomnieć sobie troszkę o co tam chodziło, ale co to ma do dołożenia sygnalizatora dzwiękowego???

W sumie nic. Pomyliłem chyba tematy Big Grin .
Ten buzer jak ma być sterowany(funkcja tone czy wystarczy ustawić pin na określony czas)?
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#5
(22-03-2017, 18:14)namok napisał(a):
(22-03-2017, 14:11)ferdricco napisał(a): Tu masz rację bo musiałem trochę przypomnieć sobie troszkę o co tam chodziło, ale co to ma do dołożenia sygnalizatora dzwiękowego???

W sumie nic. Pomyliłem chyba tematy Big Grin .
Ten buzer jak ma być sterowany(funkcja tone czy wystarczy ustawić pin na określony czas)?

Tone, bo chcę wprowadzić tony modulowane.
 
Odpowiedź
#6
(22-03-2017, 18:14)namok napisał(a):
(22-03-2017, 14:11)ferdricco napisał(a): Tu masz rację bo musiałem trochę przypomnieć sobie troszkę o co tam chodziło, ale co to ma do dołożenia sygnalizatora dzwiękowego???

W sumie nic. Pomyliłem chyba tematy Big Grin .
Ten buzer jak ma być sterowany(funkcja tone czy wystarczy ustawić pin na określony czas)?

Poprawiłem Wink
Kod:
#include <OneWire.h>
#include <DS18B20.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define ONE_WIRE_BUS 11
OneWire oneWire(ONE_WIRE_BUS);
DS18B20 sensors(&oneWire);
const int tempplus=6;
const int tempminus=7;
const int wlacznik=5;
float tempz = 50;   //inicjalizacja i przypisanie wartości tempz
byte address[8] = {0x28, 0x16, 0x5A, 0x1E, 0x7, 0x0, 0x0, 0x88};
float temperatura;  //inicjalizacja wartości zmiennoprzecinkowej
void setup()
{
 sensors.begin();  //rozpoczęcie pracy DS18B20
 pinMode(wlacznik,INPUT_PULLUP);
 pinMode(tempplus, INPUT_PULLUP);
 pinMode(tempminus, INPUT_PULLUP);
 pinMode(12,OUTPUT);
 lcd.begin(20, 4);
 lcd.backlight();
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("T.Pieca     ~");
 lcd.setCursor(0,2);
 lcd.print("Stan pompy  ~");
 lcd.setCursor(0,3);
 lcd.print("Start pompy ~");
}
boolean stan=0;
void loop()
{
   if(digitalRead(tempplus)==LOW){tempz++;}  //-zwiększenie wartości tempz
   if(digitalRead(tempminus)==LOW){tempz--;} //-zmiejszenie wartości tempz
   lcd.setCursor(14,3);                      //-ustawienie kursora
   lcd.print(tempz);                         //-wyświetlenie wartości na LCD

   if(digitalRead(wlacznik)==LOW)           //-ten algorytm odpowiada za ręczne
   {                                        // ustawienie stanu wysokiego, lub  
 delay(20);                                 // niskiego na pinie 12. Inaczej
 stan=!stan;                                // przeżutnik "T".
 digitalWrite(12,stan);
 while(digitalRead(wlacznik)==LOW);
 delay(20);
   }
   if (sensors.available())
 {
 temperatura = sensors.readTemperature(address);
 sensors.request(address);
 }
lcd.setCursor(14,0);
lcd.print(temperatura);


if (temperatura >=tempz){digitalWrite(12,HIGH); //- warunek załączenia stanu wysokiego na pinie 12
 lcd.setCursor(14,2);
 lcd.print("PRACA");
}
if (temperatura<=tempz -6){digitalWrite(12,LOW); // -warunek załączenia stanu niskiego na pinie 12
 lcd.setCursor(14,2);
 lcd.print("STOP ");
}

}
 
Odpowiedź
#7

Program poprawiłeś ale nic nie wyjaśniłeś odnośnie buzera. To Ty masz się "męczyć" i dokładnie opisywać a nie ja domyślać co i jak.
Konstrukcje typu:

Kod:
if (temperatura >=tempz){digitalWrite(12,HIGH); //- warunek załączenia stanu wysokiego na pinie 12
lcd.setCursor(14,2);
lcd.print("PRACA");
}

są nieczytelne. Za klamrą "{" w tej linii nie pisz żadnego kodu jeśli masz jeszcze inne instrukcje które są wykonywane od warunku.
Jeśli czas nie jest krytyczny to beep możesz dodać wprost w if'e.

Kod:
beep
delay
beep
Jeśli jest krytyczny to reszta zależy od tego jak ten buzer działa ale bez millis się nie obejdzie. Przerób BlinkWithoutDelay aby w zależności od zmiennej zapaliło diodę 2 razy lub raz.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#8
(23-03-2017, 09:46)namok napisał(a):
Program poprawiłeś ale nic nie wyjaśniłeś odnośnie buzera. To Ty masz się "męczyć" i dokładnie opisywać a nie ja domyślać co i jak.
Konstrukcje typu:

Kod:
if (temperatura >=tempz){digitalWrite(12,HIGH); //- warunek załączenia stanu wysokiego na pinie 12
lcd.setCursor(14,2);
lcd.print("PRACA");
}

są nieczytelne. Za klamrą "{" w tej linii nie pisz żadnego kodu jeśli masz jeszcze inne instrukcje które są wykonywane od warunku.
Jeśli czas nie jest krytyczny to beep możesz dodać wprost w if'e.

Kod:
beep
delay
beep
Jeśli jest krytyczny to reszta zależy od tego jak ten buzer działa ale bez millis się nie obejdzie. Przerób BlinkWithoutDelay aby w zależności od zmiennej zapaliło diodę 2 razy lub raz.

W sumie to już próbowałem z millis ale nie bardzo mi wychodziło. Trochę nie bardzo rozumie o co chodzi w tej funkcji.
 Znalazłem dziś dosyć ciekawy poradnik z millis i myślę że dziś coś wymęczę. Generalnie to nie chcę gotowca tylko "pokazani palcem" mniej/więcej jak.
 
Odpowiedź
#9
A sprawdzałeś jak działa BliknWithoutDelay w symulatorze: https://www.sites.google.com/site/unoardusim/home
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#10
(23-03-2017, 17:37)namok napisał(a): A sprawdzałeś jak działa BliknWithoutDelay w symulatorze: https://www.sites.google.com/site/unoardusim/ho
Sprawdzałem. I oglądałem tę funkcję w kilku innych przykładach. I prawde mówiąc tak namieszało mi to że nic nie rozumie. Namok czy możesz mi to wytłumaczyć bo chcę to zrozumieć ale... no właśnie. Namieszało mi kilka przykładów i nie wiem o co kaman a nie chcę się tym zniechęcić. Wiesz, chcę ten problem sam ogarnąć ale mam problem. Pomożesz?????????
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości