Program C i Arduino. Pomoc.

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

Program C i Arduino. Pomoc.

Post autor: fedu »

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&#40;ONE_WIRE_BUS&#41;;
LiquidCrystal_I2C lcd&#40;0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE&#41;;  // Ustawienie adresu układu na 0x27
DallasTemperature sensors&#40;&oneWire&#41;;  //Przekazanie danych dotyczących One Wire do DallasTemperature
  int buzzer = 10;                             //pin 12 jako buzzer
 

void setup&#40;void&#41;
&#123;
  pinMode&#40;buzzer,OUTPUT&#41;;                    //ustawiamy buzzer jako output
  lcd.begin&#40;16,2&#41;;       //ustaw rozdzielczość ekranu 16x4
  lcd.backlight&#40;&#41;;       // Załączenie podświetlenia 
  //Serial.begin&#40;9600&#41;;
  sensors.begin&#40;&#41;;      //Włączenie biblioteki
 
&#125;
 
void loop&#40;void&#41;
&#123;
  sensors.requestTemperatures&#40;&#41;;                  //zażądaj odczyt temperatury z czujnika
  lcd.setCursor&#40;0,0&#41;;                             //ustaw kursor w pozycji 0,0
  lcd.print&#40;"Temp1 &#58;"&#41;;                           //wyświetl "Temperatura&#58; "
  lcd.setCursor&#40;10,0&#41;; 
  lcd.print&#40;sensors.getTempCByIndex&#40;0&#41;&#41;;          //wyświetl wartość z czujnika 0

  lcd.setCursor&#40;0,1&#41;; 
  lcd.print&#40;"Temp2 &#58;"&#41;;
  lcd.setCursor&#40;10,1&#41;; 
  lcd.print&#40;sensors.getTempCByIndex&#40;1&#41;&#41;;
  delay&#40;1000&#41;;

if&#40;sensors.getTempCByIndex&#40;0&#41; >= 50&#41;       //jeżeli temperatura jest >= 30
 
  digitalWrite&#40;buzzer, HIGH&#41;;              //uruchom alarm
  
  
  
  else                                    //w przeciwnym wypadku
  digitalWrite&#40;buzzer, LOW&#41;;              //nie uruchamiaj alarmu
&#125;
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 »

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 »

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 »

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 »

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 »

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 »

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 »

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 »

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

Z tego programu, w którym buzzer działa, wynika, że potrzebuje on nie ustawienia na stałe

Kod: Zaznacz cały

digitalWrite&#40;buzzer, HIGH&#41;; 
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 »

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

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 »

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 »

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 »

Port szeregowy jest pusty. Albo coś robię nie tak. Chciałbym żeby ta melodyjka działała jako alarm.
ODPOWIEDZ