/* This example shows how to connect ML8511 to Cayenne using an Ethernet W5500 shield and send/receive sample data. The CayenneMQTT Library is required to run this sketch. If you have not already done so you can install it from the Arduino IDE Library Manager. Steps: 1. Download the Ethernet2 library (https://github.com/adafruit/Ethernet2) as a zip file. 2. From the Arduino IDE Include Library menu select Add .ZIP Library and add the downloaded Ethernet2 zip library. 3. Set the Cayenne authentication info to match the authentication info from the Dashboard. 4. Compile and upload the sketch. 5. A temporary widget will be automatically generated in the Cayenne Dashboard. To make the widget permanent click the plus sign on the widget. */ //#define CAYENNE_DEBUG // Uncomment to show debug messages #define CAYENNE_PRINT Serial // Comment this out to disable prints and save space #include // Cayenne authentication info. This should be obtained from the Cayenne Dashboard. char username[] = "MQTT_USERNAME"; char password[] = "MQTT_PASSWORD"; char clientID[] = "CLIENT_ID"; int UVOUT = A0; //Output from the sensor int REF_3V3 = A1; //3.3V power on the Arduino board void setup() { Serial.begin(9600); Cayenne.begin(username, password, clientID); pinMode(UVOUT, INPUT); pinMode(REF_3V3, INPUT); } void loop() { Cayenne.loop(); } // Default function for sending sensor data at intervals to Cayenne. // You can also use functions for specific channels, e.g CAYENNE_OUT(1) for sending channel 1 data. CAYENNE_OUT_DEFAULT() { // Write data to Cayenne here. This example just sends the current uptime in milliseconds on virtual channel 0. Cayenne.virtualWrite(0, millis()); int uvLevel = averageAnalogRead(UVOUT); int refLevel = averageAnalogRead(REF_3V3); float outputVoltage = 3.3 / refLevel * uvLevel; float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0); //Convert the voltage to a UV intensity level Cayenne.virtualWrite(1, uvIntensity); } // Default function for processing actuator commands from the Cayenne Dashboard. // You can also use functions for specific channels, e.g CAYENNE_IN(1) for channel 1 commands. CAYENNE_IN_DEFAULT() { CAYENNE_LOG("Channel %u, value %s", request.channel, getValue.asString()); //Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError("Error message"); } int averageAnalogRead(int pinToRead) { byte numberOfReadings = 8; unsigned int runningValue = 0; for(int x = 0 ; x < numberOfReadings ; x++) runningValue += analogRead(pinToRead); runningValue /= numberOfReadings; return(runningValue); } float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }