Coś Ci się zepsuło? Nie chce działać jak powinno? Opisz dokładnie swój problem a postaramy się pomóc...
fedu
Posty: 220 Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc
Post
autor: fedu » poniedziałek 20 mar 2017, 09:44
Witam. Zaczynam zabawę z Arduino i językiem C. Jestem w trakcie pisania prostego programu do pomiaru temperatury ogniw z alarmem. Jak się okazuję nie do końca taki prosty. Posiadam płytkę Arduino UNO. Dwa czujniki ds18d20 LCD 16x2 I2C i buzzer pasywny KY-006 z którym mam najwięcej kłopotów. Założenie jest takie. Temperatury wyświetlają się na LCD, i to jest ok. Przy 50stC załącza się buzer i tylko robi cichutkie "pi' i dalej cisza pomimo tego że temperatura jest po wyżej 50c. Temperatura spada po niżej 50st. znowu robi cichutkie "pi". Czemu buzzer pika po cichu i krótko ? Najfajniej żeby grała jakaś melodyjka przy tym alarmie. Rozdzielczość czujnika też nie działa i pokazuję co 0,5 stopnia. Po niżej kod którego używam.. Z góry dziękuję.
KOD Programu
Kod: Zaznacz cały
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TEMPERATURE_PRECISION 12 // rozdzielczość czujnika
#define ONE_WIRE_BUS 2 //Linia danych podpięta jest pod pin 2 Ardiuno
OneWire oneWire(ONE_WIRE_BUS);
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Ustawienie adresu układu na 0x27
DallasTemperature sensors(&oneWire); //Przekazanie danych dotyczących One Wire do DallasTemperature
int buzzer = 10; //pin 12 jako buzzer
void setup(void)
{
pinMode(buzzer,OUTPUT); //ustawiamy buzzer jako output
lcd.begin(16,2); //ustaw rozdzielczość ekranu 16x4
lcd.backlight(); // Załączenie podświetlenia
//Serial.begin(9600);
sensors.begin(); //Włączenie biblioteki
}
void loop(void)
{
sensors.requestTemperatures(); //zażądaj odczyt temperatury z czujnika
lcd.setCursor(0,0); //ustaw kursor w pozycji 0,0
lcd.print("Temp1 :"); //wyświetl "Temperatura: "
lcd.setCursor(10,0);
lcd.print(sensors.getTempCByIndex(0)); //wyświetl wartość z czujnika 0
lcd.setCursor(0,1);
lcd.print("Temp2 :");
lcd.setCursor(10,1);
lcd.print(sensors.getTempCByIndex(1));
delay(1000);
if(sensors.getTempCByIndex(0) >= 50) //jeżeli temperatura jest >= 30
digitalWrite(buzzer, HIGH); //uruchom alarm
else //w przeciwnym wypadku
digitalWrite(buzzer, LOW); //nie uruchamiaj alarmu
}
Ostatnio zmieniony środa 22 mar 2017, 18:22 przez
fedu , łącznie zmieniany 1 raz.
ptja
Posty: 2414 Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź
Post
autor: ptja » poniedziałek 20 mar 2017, 12:09
Wykorzystaj port szeregowy do podejrzenia wartości w trakcie działania programu.
I jeszcze rozważ czytanie temperatury rzadziej i tylko raz w pętli (zapamiętaj wynik i nim się posługuj, nie wołaj funkcji z tym samym parametrem wielokrotnie).
--
pozdrawiam,
Jarek Andrzejewski
fedu
Posty: 220 Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc
Post
autor: fedu » poniedziałek 20 mar 2017, 13:18
Dzięki ale dopiero zaczynam poznawać ten język. Można pokazać jak to powinno wyglądać.
ptja
Posty: 2414 Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź
Post
autor: ptja » poniedziałek 20 mar 2017, 15:37
Odkomentuj "Serial.begin(9600);" i dodaj przed i zamiast "if":
"<typ> temperatura = sensors.getTempCByIndex(0);
Serial.println(temperatura);
if (temperatura >= 50) ... dalej bez zmian"
Za <typ> wstaw typ wartości zwracanej przez funkcję = sensors.getTempCByIndex (pewnie float albo int, nie znam tej biblioteki).
--
pozdrawiam,
Jarek Andrzejewski
fedu
Posty: 220 Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc
Post
autor: fedu » poniedziałek 20 mar 2017, 19:42
Niestety dalej nie działa.
Ten kod sam działa.
int buzzer = 10; // set the buzzer control digital IO pin
void setup() {
pinMode(buzzer, OUTPUT); // set pin 8 as output
}
void loop() {
for (int i = 0; i < 100; i++) { // make a sound
digitalWrite(buzzer, HIGH); // send high signal to buzzer
delay(1); // delay 1ms
digitalWrite(buzzer, LOW); // send low signal to buzzer
delay(1);
}
delay(50);
for (int j = 0; j < 100; j++) { //make another sound
digitalWrite(buzzer, HIGH);
delay(2); // delay 2ms
digitalWrite(buzzer, LOW);
delay(2);
}
delay(1000);
}
ptja
Posty: 2414 Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź
Post
autor: ptja » poniedziałek 20 mar 2017, 19:59
Zacznij od podstaw i polub Serial. Inaczej to strzelanie na oślep.
--
pozdrawiam,
Jarek Andrzejewski
fedu
Posty: 220 Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc
Post
autor: fedu » poniedziałek 20 mar 2017, 20:12
ptja pisze: Zacznij od podstaw i polub Serial. Inaczej to strzelanie na oślep.
Dopiero się uczę. Chcę zrobić na szybko ten termometr z alarmem. Następne projekty bedę samodzielnie próbował. Po dokładnym zapoznaniu się z funkcjami języka.
ptja
Posty: 2414 Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź
Post
autor: ptja » poniedziałek 20 mar 2017, 21:07
To zleć komuś i zapłać, jak chcesz szybko.
Jeśli chcesz zrobić sam, to zacznij od nauki i korzystania ze sprawdzonych sposobów.
--
pozdrawiam,
Jarek Andrzejewski
fedu
Posty: 220 Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc
Post
autor: fedu » poniedziałek 20 mar 2017, 21:52
ptja , Szczerze mówiąc nie spodziewałem się takiej odpowiedzi.
Będę szukał dalej gdzieś jakiejś pomocy. Pozdrawiam.
Marcin S.
Posty: 435 Rejestracja: piątek 12 wrz 2008, 10:11
Post
autor: Marcin S. » poniedziałek 20 mar 2017, 21:57
Z tego programu, w którym buzzer działa, wynika, że potrzebuje on nie ustawienia na stałe
ale trzeba go wysterować falą prostokątną. W tym programie mamy paczkę 100 okresów 500Hz, 50ms przerwy, 100 okresów 250Hz, sekunda przerwy i od początku.
A w Twoim pomiarze temperatury tego nie ma.
Pzdr.
M.
ptja
Posty: 2414 Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź
Post
autor: ptja » poniedziałek 20 mar 2017, 22:27
fedu pisze: ptja , Szczerze mówiąc nie spodziewałem się takiej odpowiedzi.
Będę szukał dalej gdzieś jakiejś pomocy. Pozdrawiam.
Nie zawsze otrzymasz pomoc taką, jakiej oczekujesz.
Umiejętność znalezienia przyczyn będzie znacznie bardziej przydatna niż gotowy program... który i tak za chwilę zechcesz zmienić i napotkasz kolejny kłopot.
Programuję od ponad 30 lat, mam już pewne doświadczenie.
A rada Marcina to prawdopodobnie rozwiązanie problemu.
--
pozdrawiam,
Jarek Andrzejewski
Marcin S.
Posty: 435 Rejestracja: piątek 12 wrz 2008, 10:11
Post
autor: Marcin S. » wtorek 21 mar 2017, 07:29
fedu pisze: ptja , Szczerze mówiąc nie spodziewałem się takiej odpowiedzi.
Będę szukał dalej gdzieś jakiejś pomocy. Pozdrawiam.
Przecież nie napiszemy tego programu za Ciebie
Dostałeś wędkę, ruszaj na ryby
Pzdr.
M.
fedu
Posty: 220 Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc
Post
autor: fedu » wtorek 21 mar 2017, 09:42
Próbowałem dopisać falę prostokątną, ale albo gra cały czas albo wcale.
ptja
Posty: 2414 Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź
Post
autor: ptja » wtorek 21 mar 2017, 09:46
fedu pisze: Próbowałem dopisać falę prostokątną, ale albo gra cały czas albo wcale.
I wciąż nie chcesz użyć portu szeregowego, żeby podejrzeć stan programu?
Czego oczekujesz od nas zatem?
--
pozdrawiam,
Jarek Andrzejewski
fedu
Posty: 220 Rejestracja: piątek 11 gru 2015, 09:02
Lokalizacja: Zamosc
Post
autor: fedu » wtorek 21 mar 2017, 10:35
Port szeregowy jest pusty. Albo coś robię nie tak. Chciałbym żeby ta melodyjka działała jako alarm.