Od kilku lat mam w shacku instalację 1-wire z kilkoma czujnikami temperatury, która współpracuje z routerem TP-Linka TL-WR1043ND. Żeby dołączyć do instalacji czujnik ciśnienia i wilgotności musiałem dołożyć huba USB, który niestety okazał się wrażliwy na nadawanie w paśmie 40m. Niezależnie od mocy i anten po prostu wiesza się (długie kable 1-wire robią za anteny) i wymaga fizycznego odłączenia kabla USB od routera, dokładanie koralików na magistrali nic nie dało, więc postanowiłem zrobić trochę bardziej zaawansowane termometry pracujące na magistrali Modbus, razem z modułem I/O sprzed dwóch miesięcy. |
I have had a 1-wire bus with temperature sensors in my shack for quite some time now. The bus is connected via an USB converter to my TP-Link TL-WR1043ND router. I had to add an USB hub to connect my pressure and humidity sensor. The hub turned out to be extremely susceptible to my operation on 40 meters. No matter how small the output power was, it just hanged. I suppose that long 1-wire cables turned out to be too good antennas. The hub required manual disconnection and re-insertion to work again. Adding ferrite beads on the cables also did not help, so I decided to make more robust sensors that would use Modbus (alongside my boiler control module ). |
Projekt jest maksymalnie uproszczony, w zasadzie wszystko miałem w junk-boxie. Standardowo: mikrokontroler ATmega8, transceiver 75176 (odpowiednik MAX485), czujnik temperatury LM75, dwa gniazda 8p8c. Czujnik temperatury jest maksymalnie oddalony od stabilizatora, żeby uniknąć sztucznego podgrzewania. Jedyne bardziej wyszukane rozwiązanie to miejsce pod drugi stabilizator liniowy na 3,3V. Jest wiele czujników (np. ciśnienia, wilgotności), które wymagają zasilania 3,3V. Mimo, że magistrala I2C może być podciągana do 3,3V, to Atmegi przy zasilaniu 5V nie są w stanie poprawnie współpracować. Z drugiej strony najłatwiej dostępne transceivery magistrali RS-485 są tylko na 5V, stąd pomysł na zasilenie transceivera napięciem 5V, a mikrokontrolera i całej reszty 3,3V (mikrokontroler 3,3V działa poprawnie z transceiverem 5V). Jedyny dodatkowy element to rezystor na linii RX mikrokontrolera, który ogranicza prąd płynący z linii RO transceivera. Jeżeli zasilanie 3,3V nie jest potrzebne, to zamiast drugiego stabilizatora wystarczy wlutować zworę.
Urządzenie posiada:
- czujnik temperatury
- trzy wejścia analogowe (z dzielnikami do 20VDC)
- dwa sterowane LEDy
- dwa wyjścia tranzystorowe (otwarty dren)
- magistrala I2C na goldpinach do rozbudowy o inne czujniki
- DIP switche do ustawiania adresu na magistrali i uruchamiania bootloadera
Firmware udostępnia następujące rejestry Modbus (holding registers):
- RW 1000 – wyjście tranzystorowe 1
- RW 1001 – wyjście tranzystorowe 2
- RW 1002 – LED1
- RW 1003 – LED2
- R 1004 – wejście analogowe A1 (surowy kod ADC)
- R 1005 – wejście analogowe A2 (surowy kod ADC)
- R 1006 – wejście analogowe A3 (surowy kod ADC)
- R 1007 – wejście analogowe A1 (przeliczone w V)
- R 1008 – wejście analogowe A2 (przeliczone w V)
- R 1009 – wejście analogowe A3 (przeliczone w V)
- RW 1010 – współczynnik nachylenia wejścia A1 (do przeliczania kodu ADC na V)
- RW 1011 – współczynnik nachylenia wejścia A2 (do przeliczania kodu ADC na V)
- RW 1012 – współczynnik nachylenia wejścia A3 (do przeliczania kodu ADC na V)
- R 1013 – temperatura (w stopniach celsjusza*10)
- RW 1015 – wersja firmware (zapis 0xF00F powoduje reset urządzenia)
Przykładowo: zapis 1 do rejestru 1002 zapala diodę, zapis 0 gasi ją, a odczyt zwraca aktualny stan.
Wszystkie urządzenia wpięte razem do magistrali są całkowicie odporne na moje nadawanie 🙂
– – – > > > Schematy, firmware, software < < < - - -
The design is as simple as possible and based on my junk-box parts. Generally: ATmega8 MCU, differential bus transceiver 75176 (MAX485-like), LM75 temperature sensor, two 8p8c sockets. Temperature sensor is placed as far as possible from the linear regulator to avoid heating. The only non-trival part is an optional second 3,3V LDO. There are a lot of sensors (eg. humidity, pressure) that require 3,3V power. Although the I2C bus is open-drain and could be run on 3,3V, the ATmega8 powered by 5V would not correctly work with it. On the other hand the mostly available RS-485 transceivers are 5V-only, so I figured out that I could power the transceiver with 5V, and all the rest with 3,3V. The only extra element is current-limiting resistor on the output line of the transceiver to the MCU. If 3,3V is not required, then the place for the second LDO can be shorted.
The module features:
- thermal sensor
- three analog inputs (with voltage dividers up to 20V)
- two controllable LEDs
- two open-drain transistor outputs
- I2C bus broken-out on pin headers (for future upgrade)
- DIP switches for configuring Modbus address and starting the bootloader
Firmware exposes the following Modbus holding registers:
- RW 1000 – transistor output 1
- RW 1001 – transistor output 2
- RW 1002 – LED1
- RW 1003 – LED2
- R 1004 – A1 analog input (raw ADC code)
- R 1005 – A2 analog input (raw ADC code)
- R 1006 – A3 analog input (raw ADC code)
- R 1007 – A1 analog input (calculated value)
- R 1008 – A2 analog input (calculated value)
- R 1009 – A3 analog input (calculated value)
- RW 1010 – A1 analog input alpha coefficient (for calculating voltage from the raw ADC code)
- RW 1011 – A2 analog input alpha coefficient (for calculating voltage from the raw ADC code)
- RW 1012 – A3 analog input alpha coefficient (for calculating voltage from the raw ADC code)
- R 1013 – temperature (centigrade*10)
- RW 1015 – firmware version (writing 0xF00F resets the device)
For example: writing 1 to address 1002 lights up the LED, writing 0 turns it off, and a read returns its current state.
All devices on the bus are totally immune to my HF operation 🙂
0 komentarzy