8902

Arduino Advanced Lightning detector with AS3935 lightning sensor (code)

Jan 28th, 2026
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <LiquidCrystal.h>
  3. #include "PWFusion_AS3935_I2C.h"
  4.  
  5. // ---------------- BUTTONS ----------------
  6. #define RECALL_BTN_PIN A0
  7. #define CLOSEST_BTN_PIN A1
  8.  
  9. // ---------------- LCD ----------------
  10. const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 8;
  11. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
  12.  
  13. // ---------------- AS3935 ----------------
  14. #define IRQ_PIN 2
  15. #define SI_PIN 9
  16. #define AS3935_ADD 0x03
  17. #define AS3935_CAPACITANCE 80
  18.  
  19. #define AS3935_INDOORS 1
  20. #define AS3935_DIST_EN 1
  21.  
  22. PWF_AS3935_I2C lightning0(IRQ_PIN, SI_PIN, AS3935_ADD);
  23.  
  24. // ---------------- LEDS ----------------
  25. #define YELLOW_LED_PIN 6
  26. #define RED_LED_PIN 7
  27.  
  28. #define KM_15_MILES 24
  29. #define KM_35_MILES 56
  30.  
  31. // ---------------- STATE ----------------
  32. volatile bool AS3935_ISR_Trig = false;
  33.  
  34. float lastStrikeMiles = -1.0;
  35. float closestStrikeMiles = 9999.0;
  36.  
  37. unsigned long ledOffTime = 0;
  38. unsigned long lcdMessageUntil = 0;
  39. bool showingMessage = false;
  40.  
  41. // ---------------- ISR ----------------
  42. void AS3935_ISR() {
  43. AS3935_ISR_Trig = true;
  44. }
  45.  
  46. // ---------------- SETUP ----------------
  47. void setup() {
  48. Serial.begin(115200);
  49. Wire.begin();
  50.  
  51. pinMode(RECALL_BTN_PIN, INPUT_PULLUP);
  52. pinMode(CLOSEST_BTN_PIN, INPUT_PULLUP);
  53.  
  54. pinMode(YELLOW_LED_PIN, OUTPUT);
  55. pinMode(RED_LED_PIN, OUTPUT);
  56.  
  57. lcd.begin(16, 2);
  58. lcd.print("Lightning Det.");
  59. lcd.setCursor(0, 1);
  60. lcd.print("Initializing");
  61. digitalWrite(YELLOW_LED_PIN, LOW);
  62. digitalWrite(RED_LED_PIN, LOW);
  63. delay(1000);
  64. digitalWrite(YELLOW_LED_PIN, HIGH);
  65. digitalWrite(RED_LED_PIN, HIGH);
  66.  
  67.  
  68. delay(1500);
  69.  
  70. lightning0.AS3935_DefInit();
  71. lightning0.AS3935_ManualCal(
  72. AS3935_CAPACITANCE,
  73. AS3935_INDOORS,
  74. AS3935_DIST_EN
  75. );
  76.  
  77. attachInterrupt(digitalPinToInterrupt(IRQ_PIN), AS3935_ISR, RISING);
  78.  
  79. lcd.clear();
  80. lcd.print("Listening...");
  81. Serial.println("Listening...");
  82. }
  83.  
  84. // ---------------- LOOP ----------------
  85. void loop() {
  86. unsigned long now = millis();
  87.  
  88. // ---- LCD AUTO RETURN ----
  89. if (showingMessage && now > lcdMessageUntil) {
  90. lcd.clear();
  91. lcd.print("Listening...");
  92. showingMessage = false;
  93. }
  94.  
  95. // ---- BUTTON: LAST STRIKE ----
  96. if (!digitalRead(RECALL_BTN_PIN)) {
  97. lcd.clear();
  98. lcd.print("Last Strike:");
  99. lcd.setCursor(0, 1);
  100. if (lastStrikeMiles < 0)
  101. lcd.print("No data");
  102. else {
  103. lcd.print(lastStrikeMiles, 1);
  104. lcd.print(" mi");
  105. }
  106. lcdMessageUntil = now + 2000;
  107. showingMessage = true;
  108. }
  109.  
  110. // ---- BUTTON: CLOSEST ----
  111. if (!digitalRead(CLOSEST_BTN_PIN)) {
  112. lcd.clear();
  113. lcd.print("Closest Strike:");
  114. lcd.setCursor(0, 1);
  115. if (closestStrikeMiles > 9000)
  116. lcd.print("No data");
  117. else {
  118. lcd.print(closestStrikeMiles, 1);
  119. lcd.print(" mi");
  120. }
  121. lcdMessageUntil = now + 2000;
  122. showingMessage = true;
  123. }
  124.  
  125. // ---- AS3935 EVENT ----
  126. if (AS3935_ISR_Trig) {
  127. AS3935_ISR_Trig = false;
  128.  
  129. uint8_t src = lightning0.AS3935_GetInterruptSrc();
  130. float miles = -1.0; // <-- DECLARED HERE (fix)
  131.  
  132. if (src == 1) {
  133. uint8_t km = lightning0.AS3935_GetLightningDistKm();
  134. miles = km * 0.621371;
  135.  
  136. lastStrikeMiles = miles;
  137. if (miles < closestStrikeMiles)
  138. closestStrikeMiles = miles;
  139.  
  140. lcd.clear();
  141. lcd.print("STRIKE!");
  142. lcd.setCursor(0, 1);
  143. lcd.print(miles, 1);
  144. lcd.print(" mi");
  145.  
  146. showingMessage = true;
  147. lcdMessageUntil = now + 3000;
  148.  
  149. // LED logic
  150. if (km <= KM_15_MILES) {
  151. digitalWrite(RED_LED_PIN, LOW);
  152. delay(800);
  153. digitalWrite(RED_LED_PIN, HIGH);
  154. }
  155. else if (km <= KM_35_MILES) {
  156. digitalWrite(YELLOW_LED_PIN, LOW);
  157. delay(800);
  158. digitalWrite(YELLOW_LED_PIN, HIGH);
  159. }
  160.  
  161. ledOffTime = now + 1500;
  162.  
  163. Serial.print("Lightning: ");
  164. Serial.print(miles);
  165. Serial.println(" mi");
  166. }
  167. else if (src == 2) {
  168. Serial.println("Disturber detected");
  169. }
  170. else if (src == 3) {
  171. lcd.clear();
  172. lcd.setCursor(0, 0);
  173. lcd.print("Interference");
  174. lcd.setCursor(0, 1);
  175. lcd.print("Move sensor");
  176.  
  177. Serial.println("Noise level too high");
  178.  
  179. showingMessage = true;
  180. lcdMessageUntil = now + 2000;
  181. }
  182. }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment