INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(
Mechaniczny termometr
Witam wszystkich czytelników. Kiedyś zrobiłem sobie prosty termometr. Temperatura była wyświetlana na wyświetlaczu LCD. Zacząłem go udoskonalać dodając automatyczne podświetlenie i alarm wysokiej temperatury. Dzisiaj wpadłem na pomysł aby zrobić coś podobnego tylko zamiast wyświetlacza użyć serwomechanizmu. Kiedyś ten pomysł wydawał mi się nie do wykonania. Ale teraz po 2 latach oswajania się i programowania w Arduino coś cię nauczyłem oraz podjąłem wyzwanie i tym oto sposobem powstał ten artykuł. Nie rozpisywałem się zbytnio aby artykuł był przejrzysty. Proszę o sugestie w komentarzach.
Potrzebne elementy :
- Arduino (w moim przypadku UNO)
- serwomechanizm
- Czujnik temperatury tmp36
- płytka CD z naklejoną podziałką
- płytka stykowa
Na płytkę CD należy nakleić podziałkę z temperaturą, którą możesz narysować lub wydrukować. Ważne jest to aby podziałka utworzyła kąt 180* czyli była narysowana na połowie płyty. Poszczególne temperatury powinny być umieszczone od siebie w równych odstępach.
Wzór :
Podłączenie :
- Skrajne nóżki termometru należy podłączyć pod GND i Vcc, a środkową pod pin A0.
Należy pamiętać o podłączeniu termometru. Niewłaściwe podpięcie zasilania może go uszkodzić.
- Serwomechanizm jest podłączony pod pin 9.
Kalibracja :
Przed prawidłowym ustawieniem podziałki musisz w Serial porcie (monitorze szeregowym) odczytać aktualną temperaturę. Po odczytaniu temperatury możesz z kalibrować podziałkę z aktualnym położeniem serwa. ( Na serwomechanizm można nakleić strzałkę). Wartość serwa będzie wzrastała lub malała wraz z wartością podawanej aktualnie temperatury. Czas na program.
Program Arduino :
#include <Servo.h> // biblioteka Servo myServo; const int czujnikTemp = A0; // termometr pin A0 int odczyt; int katObrotu; // kąt obrotu void setup() { myServo.attach(9); // servo pin 9 Serial.begin(9600); } void loop() { odczyt = analogRead(czujnikTemp); float napiecie = (odczyt/1024.0) * 5.0; float temperatura = (napiecie - 0.5) * 100; katObrotu = map(temperatura, -10.0, 40.0, 0, 180); // temperatura a kąt obrotu myServo.write(katObrotu); Serial.print("temperatura: "); // obecna temperatura Serial.print(temperatura); Serial.println(); delay(1000); // opóźnienie }
W programie w linijce :
katObrotu = map(temperatura, -10.0, 40.0, 0, 180);
została podana najniższa temperatura -10 a najwyższa 40. Jeśli temperatura otoczenia przekroczy te wartości to serwo będzie w lewym lub prawym skrajnym położeniu. Jeśli macie inną podziałkę możecie sobie zamienić te temperatury.
delay(1000); // opóźnienie
Ustawiłem 1 sekundę opóźnienia. Jeśli nie chcecie aby serwo cały czas się przesuwało to możecie ustawić np. na 5 sekund.
Zdjęcia :
Miłej zabawy ;)
INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(
Uprzedzałem przed prawidłowym podłączeniem termometru, a sam go zepsułem ;) Teraz tylko pokazuje mi 50*C. Zdarza się :)
“float temperatura = (napiecie = 0.5) * 100;”
czy aby na pewno uszkodziłeś?
przypisujesz zmiennej temperaturę 0.5*100 czyli… 50
Więc?
Termometr uszkodziłem ponieważ Vcc podłączyłem do GND,a GND do Vcc. Na standardowym kodzie też mi tak pokazuje.
Krapi możesz mi coś doradzić? A jakby zmienić napięcie na 0,4 * 100
przytocz mi logikę tej linii:
“float temperatura = (napiecie = 0.5) * 100;”
bo jak dla mnie:
– tworzysz zmienną o typie “float” i nazwie “temperatura”
– zmiennej “temperatura” przypisujesz
a*) przypisujesz zmiennej “napięcie” wartość 0.5
b) wartość z a mnożysz razy 100
– temperatura zawsze będzie miała wartość 50
mam rację?
Kod nie sprawdzony, nie przetestowany, z rażącym błędem…
przykro mi, ale poradnik musi być rzetelny, ma pomagać i być pewny, a nie być polem testowym dla niepewnych projektów – także przymusowe “1”
Jednak wkradł się błąd w lini
„float temperatura = (napiecie = 0.5) * 100;”
poprawiłem „float temperatura = (napiecie – 0.5) * 100;”
teraz działa jak natura chciała ;)
Krapi dziękuję za uwagę. Dzięki niej zrozumiałem swój błąd.
Dodaj chociaż jakąś wskazówkę czy coś;)
Ja zrobiłem niedokładną tarczę termometru, ale jak chcecie możecie ją dowolnie udoskonalać ;)
Pomysł bardzo fajny :-)
Uwagi:
1) tarczę to trzeba by było na jakiejś drukarce wydrukować, od razu 1000% więcej estetyki :-)
2) pomyślałby w przyszłości, aby zrobić to na gołym kontrolerze, z funkcją usypiania i na bateryjce. I odświeżanie temperatury co np. 5 min, żeby bateria dłużej podziałała.
Na razie wstrzymuję się z oceną. Zrób ładną tarczę i pewnie trafisz na główną :-)
Tarcza zrobiona ;)
Bardzo fajnie sie sprawuje mi