Monitor for central heating system (e.g. 2zones+hw) Supports up to 15 temp probes (DS18B20/DS18S20) 3 valve monitors Gas pulse meter recording Use stand-alone or with nodeEnergyServer See http://robdobson.com/2015/09/central-heating-monitor
Dependencies: EthernetInterfacePlusHostname NTPClient Onewire RdWebServer SDFileSystem-RTOS mbed-rtos mbed-src
main.cpp
- Committer:
- Bobty
- Date:
- 2014-11-07
- Revision:
- 1:518f39df3485
- Parent:
- 0:f6611c8f453c
- Child:
- 2:6bfef0839102
File content as of revision 1:518f39df3485:
#include "mbed.h" #include "EthernetInterface.h" DigitalIn gpPin(p21); DigitalOut led(LED1); const int BROADCAST_PORT = 42853; // Arbitrarily chosen port number const int NUM_GASPULSE_VALS_IN_PACKET = 10; Serial pc(USBTX, USBRX); int main() { pc.baud(115200); printf("Gas Monitor - Rob Dobson 2014\n"); EthernetInterface eth; eth.init(); //Use DHCP UDPSocket sendSocket; Endpoint broadcast; // Connection establishment/re-establishment Timer connectRetryTimer; connectRetryTimer.start(); bool isConnected = false; // Gas Meter Pulse sample timer Timer gasPulseTimer; gasPulseTimer.start(); int gasPulseCount = 0; bool gasPulseVals[NUM_GASPULSE_VALS_IN_PACKET]; // Forever while (true) { // Check if already connected to ethernet if (!isConnected) { if (connectRetryTimer.read_ms() > 1000) { isConnected = eth.connect() == 0; connectRetryTimer.reset(); if (isConnected) { printf("Eth Connected - IP Address is %s - MAC is %s\n", eth.getIPAddress(), eth.getMACAddress()); sendSocket.init(); sendSocket.set_broadcasting(); broadcast.set_address("255.255.255.255", BROADCAST_PORT); } else { printf("Eth Connect Attempt Failed\n"); } } } else { if (gasPulseTimer.read_ms() > 1000) { gasPulseTimer.reset(); // Read from Gas Pulse pin gasPulseVals[gasPulseCount++] = gpPin; led = gpPin; if (gasPulseCount >= NUM_GASPULSE_VALS_IN_PACKET) { gasPulseCount = 0; // Send the packet char outBuf[] = "{\"gaspulseval\":[0,0,0,0,0,0,0,0,0,0]}\n"; char* pOutBuf = strchr(outBuf, '[') + 1; for (int i = 0; i < NUM_GASPULSE_VALS_IN_PACKET; i++) { *pOutBuf = gasPulseVals[i] ? '1' : '0'; pOutBuf+=2; } int bytesToSend = sizeof(outBuf) - 2; int rslt = sendSocket.sendTo(broadcast, outBuf, bytesToSend); if (rslt == bytesToSend) { printf("Sent ok %s", outBuf); } else if (rslt == -1) { printf("Failed to send %s", outBuf); isConnected = false; } else { printf("Didn't send all of %s", outBuf); isConnected = false; } } } // See if anything has failed if (!isConnected) { sendSocket.close(); eth.disconnect(); Thread::wait(1000); } } } }