ATtiny – Modbus met DS18B20 Temperatuur sensor
Op deze pagina vind je een manier om ATTiny en een Max485 chip te gebruiken als modbus interface voor een Dallas 18B20 sensor.
Wat heb je nodig?
- Hardware
- ATTiny85 chip
- Max485 chip (tbv modbus)
- DS18B20 + Weerstand 4.7K
Sluit de onderdelen aan volgens onderstaand schema:
Script met Simplemodbus en Softwareserial
Stap 1
Stel softwareserial in om niet pin 0 en 1 te gebruiken maar 4 en 3, omdat veel bibliotheken waaronder ook I2C master/slave voor de attiny altijd op pin 0 en 1 (SDA/SCL) toegewezen is.
Bewerk het bestand in de libraries folder: SimpleModbusSlaveSoftwareSerial\SimpleModbusSlaveSoftwareSerial.cpp
En vervang:
SoftwareSerial mySerial(0, 1);
in
SoftwareSerial mySerial(4, 3);
Zodende hebben we nu deze pinout:
ATTINY Pin 0 = Dallas DS18B20 (oneWire)
ATTINY Pin 2 = Max485 RX/TX Enable
ATTINY Pin 3 = Softwareserial TX (naar max485)
ATTINY Pin 4 = Softwareserial RX (naar max485)
Een baudrate van 9600/4800/2400/1200 zou ik aanbevelen, hieronder ID1, met baudrate 2400 8N1
Uitlezen met functie 3:
– Register 0 = Temperatuur heel
– Register 1 = Temperatuur decimaal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#include <SoftwareSerial.h> #include <SimpleModbusSlaveSoftwareSerial.h> #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into port 0 on the ATTiny #define ONE_WIRE_BUS 0 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); //////////////// registers of your slave /////////////////// enum { // just add or remove registers and your good to go... // The first register starts at address 0 TEMP1, TEMP2, TOTAL_ERRORS, // leave this one TOTAL_REGS_SIZE // total number of registers for function 3 and 16 share the same register array }; unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array void setup() { /* parameters(long baudrate, unsigned char ID, unsigned char transmit enable pin, unsigned int holding registers size) The transmit enable pin is used in half duplex communication to activate a MAX485 or similar to deactivate this mode use any value < 2 because 0 & 1 is reserved for Rx & Tx */ sensors.begin(); modbus_configure(9600, 1, 2, TOTAL_REGS_SIZE); } void loop() { // modbus_update() is the only method used in loop(). It r eturns the total error // count since the slave started. You don't have to use it but it's useful // for fault finding by the modbus master. sensors.requestTemperatures(); // Send the command to get temperatures float Temp = sensors.getTempCByIndex(0); // Split float in 2 integers. int tempheel = Temp ; int tempdecimaal = (Temp - tempheel) * 100; holdingRegs[0] = tempheel; holdingRegs[1] = tempdecimaal; modbus_update(holdingRegs); // GEEN DELAYS IN DE LOOP PLAATSEN! } |