Distanz-/Tiefenmesser mit JSN-SR40T
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

EchoLotSetup.cpp 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. * EchoLotSetup.cpp
  3. *
  4. * Created on: 10.01.2026
  5. * Author: FSmilari
  6. */
  7. #include "EchoLotSetup.h"
  8. #define ADDR_AIR_TEMP 0 // WORD
  9. #define ADDR_WATER_TEMP 2 // +2 WORDs
  10. #define ADDR_SONIC_AIR 4 // +2 WORDs
  11. #define ADDR_SALTPERMIL 6 // +2 WORDs
  12. // --------------------------------------------------
  13. // Konstruktor
  14. // --------------------------------------------------
  15. EchoLotSetup::EchoLotSetup(Display &display) : display(display) {
  16. airTemp = 20.0f;
  17. waterTemp = 20.0f;
  18. sonicSpeedAir = 343.0f;
  19. saltPromilleWater = 35;
  20. doInitialization = true;
  21. configStepIndex = 0;
  22. }
  23. // --------------------------------------------------
  24. // Initialisierung
  25. // --------------------------------------------------
  26. void EchoLotSetup::initialize() {
  27. EEPROM.init();
  28. readFromEEPROM();
  29. doInitialization = false;
  30. }
  31. // --------------------------------------------------
  32. // Rotary Switch (kurz)
  33. // --------------------------------------------------
  34. void EchoLotSetup::onRotaryControlerSwitch() {
  35. configStepIndex++;
  36. if (configStepIndex >= 5) {
  37. configStepIndex = 0;
  38. }
  39. }
  40. // --------------------------------------------------
  41. // Rotary Switch (lang)
  42. // --------------------------------------------------
  43. void EchoLotSetup::onRotaryControlerLongSwitch() {
  44. }
  45. // --------------------------------------------------
  46. // Rotary Drehung
  47. // --------------------------------------------------
  48. void EchoLotSetup::onRotaryControlerTurn(RotaryEncoder::Direction turn)
  49. {
  50. float delta = (turn == RotaryEncoder::Direction::CLOCKWISE) ? 1.0f : -1.0f;
  51. switch (configStepIndex) {
  52. case 0:
  53. airTemp += delta;
  54. break;
  55. case 1:
  56. waterTemp += delta;
  57. break;
  58. case 2:
  59. sonicSpeedAir += delta;
  60. break;
  61. case 3:
  62. saltPromilleWater += delta;
  63. break;
  64. default:
  65. break;
  66. }
  67. }
  68. // --------------------------------------------------
  69. // Speichern bestätigen
  70. // --------------------------------------------------
  71. void EchoLotSetup::save() {
  72. saveToEEPROM();
  73. }
  74. // --------------------------------------------------
  75. // Abbrechen
  76. // --------------------------------------------------
  77. void EchoLotSetup::cancel() {
  78. readFromEEPROM();
  79. }
  80. // --------------------------------------------------
  81. // Display leeren
  82. // --------------------------------------------------
  83. void EchoLotSetup::clear() {
  84. display.clearDisplay();
  85. }
  86. // --------------------------------------------------
  87. // EEPROM lesen
  88. // --------------------------------------------------
  89. void EchoLotSetup::readFromEEPROM() {
  90. setAirTemp(readFloatFromEEPROM(ADDR_AIR_TEMP));
  91. setWaterTemp(readFloatFromEEPROM(ADDR_WATER_TEMP));
  92. setSonicSpeedAir(readFloatFromEEPROM(ADDR_SONIC_AIR));
  93. setSaltPromilleWater(readIntegerFromEEPROM(ADDR_SALTPERMIL));
  94. printValues();
  95. }
  96. // --------------------------------------------------
  97. // EEPROM schreiben
  98. // --------------------------------------------------
  99. void EchoLotSetup::saveToEEPROM() {
  100. writeFloatToEEPROM(ADDR_AIR_TEMP, airTemp);
  101. writeFloatToEEPROM(ADDR_WATER_TEMP, waterTemp);
  102. writeFloatToEEPROM(ADDR_SONIC_AIR, sonicSpeedAir);
  103. writeIntegerToEEPROM(ADDR_SALTPERMIL, saltPromilleWater);
  104. }
  105. // --------------------------------------------------
  106. // Werte anzeigen
  107. // --------------------------------------------------
  108. void EchoLotSetup::printValues() {
  109. String value = String(sonicSpeedAir);
  110. Serial.print(String(AIRTEMP) + ": " + String(getAirTemp(), 1) + ", ");
  111. Serial.print(String(WATERTEMP) + ": " + String(getWaterTemp(), 1) + ", ");
  112. Serial.print(String(SONICSPEEDAIR) + ": " + String(getSonicSpeedAir(), 1) + ", ");
  113. Serial.println(String(SALTPROMILLEWATER) + ": " + String(getSaltPromilleWater()));
  114. }
  115. // --------------------------------------------------
  116. // Private Helper
  117. // --------------------------------------------------
  118. String EchoLotSetup::getCfgOptForStepIndex(byte index) {
  119. return ConfigStep[index];
  120. }
  121. String EchoLotSetup::getCfgOptUnitForStepIndex(byte index) {
  122. switch (index) {
  123. case 0:
  124. case 1:
  125. return "°C";
  126. case 2:
  127. case 3:
  128. return "m/s";
  129. default:
  130. return "";
  131. }
  132. }
  133. float EchoLotSetup::getAirTemp() const {
  134. return airTemp;
  135. }
  136. void EchoLotSetup::setAirTemp(float airTemp) {
  137. this->airTemp = airTemp;
  138. }
  139. float EchoLotSetup::getWaterTemp() const {
  140. return waterTemp;
  141. }
  142. void EchoLotSetup::setWaterTemp(float waterTemp) {
  143. this->waterTemp = waterTemp;
  144. }
  145. float EchoLotSetup::getSonicSpeedAir() const {
  146. return sonicSpeedAir;
  147. }
  148. void EchoLotSetup::setSonicSpeedAir(float sonicSpeedAir) {
  149. this->sonicSpeedAir = sonicSpeedAir;
  150. }
  151. int EchoLotSetup::getSaltPromilleWater() const {
  152. return saltPromilleWater;
  153. }
  154. void EchoLotSetup::setSaltPromilleWater(int saltPromilleWater) {
  155. this->saltPromilleWater = saltPromilleWater;
  156. }
  157. void EchoLotSetup::writeFloatToEEPROM(uint16_t addr, float value) {
  158. uint16_t *p = (uint16_t*) (void*) &value;
  159. // float = 2 x uint16_t
  160. EEPROM.update(addr, p[0]);
  161. EEPROM.update(addr + 1, p[1]);
  162. }
  163. float EchoLotSetup::readFloatFromEEPROM(uint16_t addr) {
  164. float value;
  165. uint16_t *p = (uint16_t*) (void*) &value;
  166. p[0] = EEPROM.read(addr);
  167. p[1] = EEPROM.read(addr + 1);
  168. return value;
  169. }
  170. void EchoLotSetup::writeIntegerToEEPROM(uint16_t addr, int value) {
  171. EEPROM.update(addr, (uint16_t) value);
  172. }
  173. int EchoLotSetup::readIntegerFromEEPROM(uint16_t addr) {
  174. return (int) EEPROM.read(addr);
  175. }