WaveshareBoard.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #pragma once
  2. #include <Arduino.h>
  3. #include <MeshCore.h>
  4. // LoRa radio module pins for Waveshare RP2040-LoRa-HF/LF
  5. // https://files.waveshare.com/wiki/RP2040-LoRa/Rp2040-lora-sch.pdf
  6. /*
  7. * This board has no built-in way to read battery voltage.
  8. * Nevertheless it's very easy to make it work, you only require two 1% resistors.
  9. *
  10. * BAT+ -----+
  11. * |
  12. * VSYS --+ -/\/\/\/\- --+
  13. * 200k |
  14. * +-- GPIO28
  15. * |
  16. * GND --+ -/\/\/\/\- --+
  17. * | 100k
  18. * BAT- -----+
  19. */
  20. #define PIN_VBAT_READ 28
  21. #define BATTERY_SAMPLES 8
  22. #define ADC_MULTIPLIER (3.0f * 3.3f * 1000)
  23. class WaveshareBoard : public mesh::MainBoard {
  24. protected:
  25. uint8_t startup_reason;
  26. public:
  27. void begin();
  28. uint8_t getStartupReason() const override { return startup_reason; }
  29. #ifdef P_LORA_TX_LED
  30. void onBeforeTransmit() override { digitalWrite(P_LORA_TX_LED, HIGH); }
  31. void onAfterTransmit() override { digitalWrite(P_LORA_TX_LED, LOW); }
  32. #endif
  33. uint16_t getBattMilliVolts() override {
  34. #if defined(PIN_VBAT_READ) && defined(ADC_MULTIPLIER)
  35. analogReadResolution(12);
  36. uint32_t raw = 0;
  37. for (int i = 0; i < BATTERY_SAMPLES; i++) {
  38. raw += analogRead(PIN_VBAT_READ);
  39. }
  40. raw = raw / BATTERY_SAMPLES;
  41. return (ADC_MULTIPLIER * raw) / 4096;
  42. #else
  43. return 0;
  44. #endif
  45. }
  46. const char *getManufacturerName() const override { return "Waveshare RP2040-LoRa"; }
  47. void reboot() override { rp2040.reboot(); }
  48. bool startOTAUpdate(const char *id, char reply[]) override;
  49. };