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.

EchoLot.ino 4.6KB

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