Projekt Arduino: rozbudowana waga pasieczna z połączeniem GSM #2
Witam
Zapraszam na kontynuację postu o projekcie wagi pasiecznej. Mam nadzieję, że post będzie w miarę logicznie napisany, ze względu na długi odstęp czasu i ilość pracy nie mogłem opisać wszystkiego. Skupiłem się na najważniejszych kwestiach oraz problemach, które napotkałem podczas realizacji projektu. Jeśli ktoś nie czytał pierwszej części, to serdecznie zapraszam TUTAJ
Moduł GSM (neoway m590)
Pierwsze prace postanowiłem zacząć od polutowania i uruchomienia modułu GSM. Jeśli chodzi o lutowanie (było to moje pierwsze lutowanie komponentów SMD) wszystko poszło gładko. Może nie jest perfekcyjnie, ale działa ; )
kleksy lutu na module to nie moja sprawka, takie dostałem (są to podzespoły pochodzące z demontażu)
Trudniejszą sprawą okazało się uruchomienie. Moduł jest zasilany przez przetwornice, ustawioną na napięcie 3.9V które według specyfikacji jest najlepsze dla neoway. Dioda prostownicza została usunięta a miejsce po niej połączone zworką.
miejsce po diodzie prostowniczej, złączone zworką
Po podłączeniu do PC-ta, w terminalu modem wyrzucał co kilka sekund jedynie "MODEM:STARTUP". Co oznacza, że coś jest nie tak i moduł się restartuje. Zgodnie z zaleceniami z różnych forów internetowych, wymieniłem kondensator z zestawu na 1000uF oraz rezystor przy karcie SIM na 10K.
kondensator 1000uF
miejsce wymiany rezystora na 10K
Wszystko wymienione, podłączam moduł, odpalam terminal iiii..... MODEM:STARTUP.. MODEM:STARTUP.. Cały dzień szukania winowajcy, oglądania czy wszystko, aby dobrze jest zlutowane.. pustka. Winnemu za to wszystko okazało się coś najprostszego. Do połączenia przetwornicy z modułem, używałem płytki prototypowej. Do zestawu dostałem do niej kabelki, które okazały się bardzo niskiej jakości, raz stykały raz nie, powodując spadki napięcia i restart modułu. Na zdjęciu poniżej można porównać chińskie niteczki z kablami nieco lepszej jakości.
po lewej "chiński" kabelek
Po wymianie kabli wszystko ruszyło. Modem wyrzuca w terminalu "MODEM:STARTUP" oraz "PBREADY". Po wpisaniu komendy "AT" odpowiada "OK". Wszystko stabilnie działa.
Waga
Przyszedł czas na wagę. Zacząłem oczywiście od wypatroszenia. Kabelki łączące tensometry są opisane, więc nie miałem większego problemu z połączeniem do wzmacniacza (hx711).
Płytka znajdująca się w wadze łazienkowej, z podpisanymi połączeniami
W następnej kolejności zacząłem kalibrację wagi (a właściwie odczyt współczynników kalibracji) za pomocą sketcha dostępnego na Github (link do użytego sketcha)
Moje stanowisko kalibracji. Przepraszam za bałagan ; D
Po zapisanie wsp. kalibracji. Przeszedłem do programu. Pomijam cały proces programowania, kod aktualnie ma ponad 200 linii. Opiszę tylko najważniejsze fragmenty. Musiałem rozwiązać problem braku możliwości zerowania wagi przed pomiarami. Ze względu na to, że ul będzie stale stał na wadze, nie ma takiej możliwości. Ustawiłem wsp. kalibracji oraz odczyt zerowy jako zmienne.
#define calibration_factor 19770.0 // wsp.kalibracji wagi #define odczyt_zerowy 8097425 // odczyt zerowy wagi #define DOUT 3 //PIN DAT wagi #define CLK 2 //PIN CLK wagiNastępnie użyłem zmiennych w miejscu programowania wagi.
Serial.println("Programowanie wagi..."); scale.set_scale(calibration_factor); // kalibracja scale.set_offset(odczyt_zerowy); // odczyt zerowy/tarowanie Serial.println("Waga zaprogramowana");
Takie rozwiązanie ma oczywiście spory minus. Bez względu na zmianę rezystancji spowodowaną, chociażby warunkami pogodowymi, odczyt zerowy będzie ten sam. Spowoduje to prawdopodobnie duże "pływanie" pomiaru. Podczas testów zobaczę jak duże. Myślę nad zastosowaniem pomiaru referencyjnego za pomocą dodatkowych tensometrów.
Kod i działanie projektu !
Przyszedł czas na programowanie i ostateczny test całego projektu. Do programowani użyłem następujących bibliotek:
#include <DallasTemperature.h>
#include "HX711.h"
#include <OneWire.h>
#include <AltSoftSerial.h>
Poniżej fragment kodu gdzie definiuje co i jak ma być wysłane w sms po komendzie "info"
if(msg_id!=0) GSM.print("AT+CMGD="); GSM.print(msg_id); GSM.print("\r"); Serial.println("wiadomosc usunieta"); msg_id=0; }else if(send_resp){ send_resp=0; GSM.print("AT+CMGS=\"+48XXXXXXXX\"\r"); delay(550); sensors.requestTemperatures(); Serial.println("odczytana temperatura:"); Serial.println(sensors.getTempCByIndex(0)); delay(300); GSM.print("Temp"); //tu wpisujemy treść wiadomości (do 160 znaków) GSM.print(":"); temperatura = sensors.getTempCByIndex(0); GSM.print(temperatura); GSM.print("*C"); delay(200); GSM.print(",Waga:"); GSM.print(scale.get_units(), 1); GSM.print("kg"); GSM.print((char)26); Serial.println("Info wyslane"); wait_for_sending=1; } }
OK!. Czas na ostateczny test. Wszystko podłączone. Wysyłam SMS o treści "info" iiii... DZIAŁA !
Jestem pod wielkim wrażeniem :)
Sama wychodzę z założenia, że chcieć to móc.
Dawno nic nie pisałeś o wadze. Powrót do projektu?
Musiałem odłożyć na czas pisania pracy dyplomowej. Ale dużo udało mi się zrobić, głowny kod już zrobiłem. Teraz tylko sprawa tego zasilania + testy ; )
Podziwiam, naprawdę jesteś pozytywnie zaangażowany.
Dzięki ; )
No coś pięknego Jesteś "GOŚĆ" przez wielkie G również podziwiam Miło Ciebie poznać :) Może wykrywacze metali też Cię interesują ?
Dzięki za miłe słowa. Co do wykrywaczy, pewnie, dodatkowo łowie czasami na magnes ; ) Ale jak dotychczas nie udało mi się nic sensownego znaleźć, sam złom
Congratulations on the whole project !!
could you upload somewhere the code? to try and other beekeepers;
greetings from GREECE
Hi! Can you help me with a project like this, please?