/** * SPDX-FileCopyrightText: 2026 Maximiliano Ramirez <maximiliano.ramirezbravo@gmail.com> * * SPDX-License-Identifier: MIT *//** * ReactiveESP32 Example Overview: * - This example demonstrates conditional nodes using multiple sources. * - A Signal<bool> named 'use_fahrenheit' determines whether to display temperature in Celsius or * Fahrenheit. * - Two Signal<uint16_t> represent temperature sensors in Celsius and Fahrenheit. * - A Computed<float> named 'displayed_temperature' selects which sensor to read based on * 'use_fahrenheit'. * - Changing 'use_fahrenheit' dynamically updates dependencies, demonstrating conditional tracking. * * - The Serial interface is used to read commands: * - 'g': Get current values. * - 't': Toggle between Celsius and Fahrenheit display. * - 'c': Update Celsius temperature sensor. * - 'f': Update Fahrenheit temperature sensor. * * - Pressing '0' restarts the ESP32. */#include<ReactiveESP32.h>usingnamespaceRxESP32;/* ---------------------------------------------------------------------------------------------- */// Define a signal which will be used as the conditionSignal<bool>use_fahrenheit(false);// Example signal representing a temperature sensor in celsius, range 0-100°C (0-1023 ADC)Signal<uint16_t>temp_sensor_celsius(255);// Example signal representing a temperature sensor in fahrenheit, range 32-212°F (0-1023 ADC)Signal<uint16_t>temp_sensor_fahrenheit(511);// Define a computed value that selects between celsius and fahrenheit based on the condition signalComputed<float>displayed_temperature([](){// Dynamically track dependencies based on the conditionif(use_fahrenheit.get()){floatfahrenheit=temp_sensor_fahrenheit.get()*(180.0f/1023.0f)+32.0f;Serial.printf("\tDisplaying temperature in Fahrenheit: %.2f°F\n",fahrenheit);returnfahrenheit;}else{floatcelsius=temp_sensor_celsius.get()*(100.0f/1023.0f);Serial.printf("\tDisplaying temperature in Celsius: %.2f°C\n",celsius);returncelsius;}});// Read Serial input and process commandsvoidserialRead();/* ---------------------------------------------------------------------------------------------- */voidsetup(){Serial.begin(115200);delay(1000);Serial.println("========================================");Serial.println("ReactiveESP32 - ConditionalNodes Example");Serial.println("========================================");// Start the ReactiveESP32 dispatcherif(!Dispatcher::start()){Serial.println("Failed to start ReactiveESP32 Dispatcher!");while(true){delay(1000);}}}voidloop(){serialRead();}voidserialRead(){if(!Serial.available())return;charc=Serial.read();if(c=='\r')return;if(c=='\n')c=' ';Serial.printf("> %c\n",c);switch(c){case'0':{// Restart the ESP32ESP.restart();}break;case't':{// Toggle between celsius and fahrenheit displayboolusing_fahrenheit=use_fahrenheit.get();use_fahrenheit.set(!using_fahrenheit);Serial.printf("Display mode toggled to %s\n",using_fahrenheit?"Celsius":"Fahrenheit");}break;case'c':{// Randomly update celsius temperature sensoruint16_tnew_celsius=random(0,1024);if(!temp_sensor_celsius.set(new_celsius)){Serial.printf("Celsius sensor unchanged: %u\n",new_celsius);}else{Serial.printf("Celsius sensor updated to raw value: %u\n",new_celsius);}}break;case'f':{// Randomly update fahrenheit temperature sensoruint16_tnew_fahrenheit=random(0,1024);if(!temp_sensor_fahrenheit.set(new_fahrenheit)){Serial.printf("Fahrenheit sensor unchanged: %u\n",new_fahrenheit);}else{Serial.printf("Fahrenheit sensor updated to raw value: %u\n",new_fahrenheit);}}break;case'g':{// Get the current value of sensors and displayed temperatureuint16_tvalue_celsius=temp_sensor_celsius.get();uint16_tvalue_fahrenheit=temp_sensor_fahrenheit.get();floatvalue_displayed=displayed_temperature.get();Serial.printf("Celsius raw: %u - Fahrenheit raw: %u - Displayed Temperature: %.2f°%c\n",value_celsius,value_fahrenheit,value_displayed,use_fahrenheit.get()?'F':'C');}break;}}