Distanz-/Tiefenmesser mit JSN-SR40T
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

EchoLot.ino 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include "Arduino.h"
  2. #include "ExEzButton.h"
  3. #include "Status.h"
  4. #include "RotaryControler.h"
  5. #include "EchoLotSetup.h"
  6. #include "ThreePositionSwitch.h"
  7. #define VERSION "0.9.0"
  8. static const int trigPin = PB11;
  9. static const int echoPin = PB10;
  10. static const int Pos3Sw_Pin1 = PB13;
  11. static const int Pos3Sw_Pin2 = PB14;
  12. static const int Pos3Sw_Pin3 = PB15;
  13. static const int Measure_Pin = PB6;
  14. static const int RotEnc_Clk_Pin = PB7;
  15. static const int RotEnc_Dta_Pin = PB8;
  16. static const int RotEnc_Switch_Pin = PB9;
  17. Status actualStatus;
  18. Status originStatus;
  19. String oldStatus = "";
  20. String lastDistance = "";
  21. int environmentPostion = 0;
  22. RotaryControler rotaryControler(RotEnc_Dta_Pin, RotEnc_Clk_Pin, RotEnc_Switch_Pin);
  23. ExEzButton measureBtn(Measure_Pin, false, 2000);
  24. ThreePositionSwitch threePositionSwitch(Pos3Sw_Pin1, Pos3Sw_Pin2, Pos3Sw_Pin3);
  25. Display display;
  26. EchoLotSetup echoLotSetup(display);
  27. //*****************************************************************************************************
  28. //*** Initialization routine. Reads the eeprom first and sets the (potentially new) configured values.
  29. //*****************************************************************************************************
  30. void Initialize() {
  31. display.showInitialization(VERSION);
  32. echoLotSetup.initialize();
  33. echoLotSetup.drawInitScreen();
  34. delay(2000);
  35. }
  36. void setup() {
  37. Serial.begin(115200);
  38. delay(500);
  39. pinMode(RotEnc_Switch_Pin, INPUT);
  40. pinMode(RotEnc_Dta_Pin, INPUT);
  41. pinMode(RotEnc_Clk_Pin, INPUT);
  42. pinMode(trigPin, OUTPUT);
  43. pinMode(echoPin, INPUT);
  44. pinMode(Measure_Pin, INPUT);
  45. measureBtn.setDebounceTime(50);
  46. rotaryControler.setDebounceTime(50);
  47. threePositionSwitch.setDebounceTime(50);
  48. display.init();
  49. SetActualStatus(INITIALIZATION);
  50. Serial.println("Setup end");
  51. delay(50);
  52. }
  53. void loop() {
  54. switch (actualStatus) {
  55. case INITIALIZATION:
  56. Initialize();
  57. SetActualStatus(IDLE);
  58. originStatus = INITIALIZATION;
  59. break;
  60. case CONFIGURATION:
  61. rotaryControler.loop();
  62. if (originStatus != CONFIGURATION) {
  63. display.setRefreshScreen();
  64. display.showFrame(actualStatus);
  65. echoLotSetup.initialize();
  66. }
  67. if (rotaryControler.isSwitchPressed()) {
  68. echoLotSetup.onRotaryControlerSwitch();
  69. }
  70. echoLotSetup.onRotaryControlerTurn(rotaryControler.getEncoderMove());
  71. if (rotaryControler.isSwitchLongPressed()) {
  72. Serial.println("RotaryEnc Long SwitchPressed");
  73. delay(50);
  74. echoLotSetup.onRotaryControlerLongSwitch();
  75. echoLotSetup.initialize();
  76. SetActualStatus(IDLE);
  77. }
  78. originStatus = CONFIGURATION;
  79. break;
  80. case IDLE: {
  81. measureBtn.loop();
  82. rotaryControler.loop();
  83. threePositionSwitch.loop();
  84. if (originStatus == CONFIGURATION || originStatus == INITIALIZATION) {
  85. display.setRefreshScreen();
  86. display.showFrame(actualStatus);
  87. }
  88. if (rotaryControler.isSwitchLongPressed()) {
  89. Serial.println("RotaryEnc Long SwitchPressed");
  90. delay(50);
  91. SetActualStatus(CONFIGURATION);
  92. }
  93. environmentPostion = threePositionSwitch.getPosition();
  94. display.setEnvironment(environmentPostion);
  95. if (measureBtn.isPressing()) {
  96. SetActualStatus(MEASURING);
  97. }
  98. originStatus = IDLE;
  99. delay(50);
  100. break;
  101. }
  102. case MEASURING:
  103. measureBtn.loop();
  104. if (measureBtn.isPressing()) {
  105. display.runMeasureAnimation(true);
  106. digitalWrite(trigPin, LOW);
  107. delayMicroseconds(5);
  108. digitalWrite(trigPin, HIGH);
  109. delayMicroseconds(20);
  110. digitalWrite(trigPin, LOW);
  111. uint32_t duration = pulseIn(echoPin, HIGH);
  112. uint32_t distance = calculateDistance(duration);
  113. display.setDistance(distance);
  114. display.runMeasureAnimation(true);
  115. delay(200);
  116. } else {
  117. display.setDistance(0);
  118. display.runMeasureAnimation(false);
  119. SetActualStatus(IDLE);
  120. }
  121. originStatus = MEASURING;
  122. break;
  123. default:
  124. break;
  125. }
  126. }
  127. void SetActualStatus(Status newStatus) {
  128. if (actualStatus != newStatus) {
  129. actualStatus = newStatus;
  130. }
  131. }
  132. uint32_t calculateDistance(uint32_t duration) {
  133. if (environmentPostion == 1) {
  134. float airTemp = echoLotSetup.getAirTemp();
  135. float speedAir = echoLotSetup.getSonicSpeedAir();
  136. return ((speedAir + 0.6 * airTemp) / 1000 * duration) / 2;
  137. } else {
  138. //cS = (1449 + 4,6T - 0,05T^2 + 1,4(S-35)) T=Tempeature, S= Salt in PerMille
  139. float waterTemp = echoLotSetup.getWaterTemp();
  140. int saltLvl = environmentPostion == 2 ? 0 : echoLotSetup.getSaltPromilleWater();
  141. int speedWater = 1449 + 4.6 * waterTemp - 0.05 * pow(waterTemp, 2) + 1.4 * (saltLvl - 35);
  142. Serial.println("duration: " + String(duration));
  143. Serial.println("saltLvl: " + String(saltLvl));
  144. Serial.println("speedWater: " + String(speedWater));
  145. Serial.println("distance: " + String((float(speedWater) / 1000 * duration) / 2));
  146. return (float(speedWater) / 1000 * duration) / 2;
  147. }
  148. }