Following next is the bridge structure monitoring, load cell is used to simulate sensors on bridge that is used to monitor any bridge structural change. This information can provide early information to the operator at base station about bridge health. The load cell is measured by the HX-711, a 24-bit ADC which is commonly used for weighing scale sensor. The voltage change of load cell with respect to the stress and strain is relatively small, this is why 24-bit ADC is required in this case. The Arduino interface with HX711 ADC through two wire interface (TWI).
Moving on is the earthquake monitoring, where the earth movement is measured by a three-axis accelerometer, ADXL335 from Analog Device. Instead of using the internal ADC of microcontroller, we are required to use an external ADC for measurement, in this case, TI ADS1115 16-bit ADC is used. This ADC provides four single ended input or can also be configured to dual differential input measurement. It uses the inter-integrated circuit (I2C) communication for configuration and data acquisition.
The third monitoring is more straightforward, which is the sea water level monitoring. Water level sensor is used to measure water level, which simulates any high rise/abnormal water level. This sensor is measured directly by the Arduino Nano internal ADC.
One of the challenging part for this project was to implement a many-to-one network topology among the sensor nodes and central hub. There are various wireless modules that are available such as Wifi, bluetooth, Zigbee and other RF module. The most suitable candidate would be Zigbee protocol as it can offer true mesh network. Xbee by Digi International offers variety of module with Zigbee protocol. However, they are too costly for this project, so other alternative has to be used. After some search, nRF24L01+ is selected as it is low cost and able to achieve tree topology network with the help from library. The RF24Network by tmrh20 plays an important role to make this networking happen.
The image above shows the network that can be achieved by the RF24Network library. Image credit to http://tmrh20.github.io/RF24Network/Tuning.html. A lot of useful information is available from tmrh20 github, so do check it out for more info. In this project, since there are only three sensor nodes, so only first level addressing is used. The central hub would be the CT-ARM while the end nodes are all the Arduino Nano.
This was my first time hands on with nRF24L01+ module, a lot of time was spent to just make this thing work at the beginning. One of the important lesson learnt, which is also mentioned many time by other user, was the importance of decoupling cap. There is never too much of decoupling capacitor for this power sensitive module. I used the breakout board which I made long ago, check it out here. This breakout board has a 10uF electrolytic cap. I also manually soldered 0.1uF ceramic capacitor across the Vdd and GND on top of the module. With all these, I saved more time troubleshooting and focus on the programming.
Since there are three sensor nodes that will be communicating with the central hub, it is impossible for them to send the data all the time. So, in order to solve this problem, the transmission is controlled by central hub. The overall system timing diagram is shown as the figure below. At frame 1, the hub starts to ping (PING) the node 1, and at the same time all three nodes start to acquire data from various sensors. Once the node 1 acknowledge and data is ready, it will transmit (TX) the data back to the hub for processing (PSx). After host PC processed the data, it will send data packet to the Host PC to update the data monitoring dashboard. When the central hub completes for one node, it will repeat the same process for the subsequent node.
To send the data from CT-ARM to Host PC, all the sensor measurements are packed into a self defined string format. ‘$’ is used as the header of the string while the end of string is terminated by the ‘rn’ character. The first info in the data packet is the node address identifier, which will be used by the vi to identify which packet received does it belongs to. The rest of the string contains all the measured value processed at the central hub.