PageRenderTime 56ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/RPi_AS3935/RPi_AS3935.py

https://github.com/piliwilliam0306/RaspberryPi-AS3935
Python | 111 lines | 89 code | 18 blank | 4 comment | 16 complexity | ddb8cd44713d80e47abd3e6df65e697c MD5 | raw file
  1. import smbus
  2. import time
  3. class RPi_AS3935:
  4. """A basic class used for interacting with the AS3935 lightning
  5. sensor from a Raspberry Pi over I2C"""
  6. def __init__(self, address, bus=0):
  7. self.address = address
  8. self.i2cbus = smbus.SMBus(bus)
  9. def calibrate(self, tun_cap=None):
  10. """Calibrate the lightning sensor - this takes up to half a second
  11. and is blocking"""
  12. time.sleep(0.08)
  13. self.read_data()
  14. if tun_cap != None:
  15. if tun_cap < 0x10 and tun_cap > -1:
  16. self.set_byte(0x08, (self.registers[0x08] & 0xF0) | tun_cap)
  17. time.sleep(0.002)
  18. else:
  19. raise Exception("Value of TUN_CAP must be between 0 and 15")
  20. self.set_byte(0x3D, 0x96)
  21. time.sleep(0.002)
  22. self.set_byte(0x08, self.registers[0x08] | 0x20)
  23. time.sleep(0.002)
  24. self.read_data()
  25. self.set_byte(0x08, self.registers[0x08] & 0xDF)
  26. time.sleep(0.002)
  27. def get_interrupt(self):
  28. self.read_data()
  29. return self.registers[0x03] & 0x0F
  30. def get_distance(self):
  31. self.read_data()
  32. if self.registers[0x07] & 0x3F == 0x3F:
  33. return False
  34. else:
  35. return self.registers[0x07] & 0x3F
  36. def get_noise_floor(self):
  37. self.read_data()
  38. return (self.registers[0x01] & 0x38) >> 4
  39. def set_noise_floor(self, noisefloor):
  40. self.read_data()
  41. noisefloor = (noisefloor & 0x07) << 4
  42. write_data = (self.registers[0x01] & 0xC7) + noisefloor
  43. self.set_byte(0x01, write_data)
  44. def lower_noise_floor(self, min_noise=0):
  45. floor = self.get_noise_floor()
  46. if floor > min_noise:
  47. floor = floor - 1
  48. self.set_noise_floor(floor)
  49. return floor
  50. def raise_noise_floor(self, max_noise=7):
  51. floor = self.get_noise_floor()
  52. if floor < max_noise:
  53. floor = floor + 1
  54. self.set_noise_floor(floor)
  55. return floor
  56. def get_min_strikes(self):
  57. self.read_data()
  58. return (self.registers[0x02] >> 4) & 0x03
  59. def set_min_strikes(self, minstrikes):
  60. self.read_data()
  61. minstrikes = (minstrikes & 0x03) << 4
  62. write_data = (self.registers[0x02] & 0xE7) + minstrikes
  63. self.set_byte(0x02, write_data)
  64. def get_indoors(self):
  65. self.read_data()
  66. if self.registers[0x00] & 0x10 == 0x10:
  67. return True
  68. else:
  69. return False
  70. def set_indoors(self, indoors):
  71. self.read_data()
  72. if indoors:
  73. write_value = (self.registers[0x00] & 0xE0) + 0x12
  74. else:
  75. write_value = (self.registers[0x00] & 0xE0) + 0x0E
  76. self.set_byte(0x00, write_value)
  77. def set_mask_disturber(self, mask_dist):
  78. self.read_data()
  79. if mask_dist:
  80. write_value = self.registers[0x03] | 0x20
  81. else:
  82. write_value = self.registers[0x03] & 0xDF
  83. self.set_byte(0x03, write_value)
  84. def get_mask_disturber(self):
  85. self.read_data()
  86. if self.registers[0x03] & 0x20 == 0x20:
  87. return True
  88. else:
  89. return False
  90. def set_byte(self, register, value):
  91. self.i2cbus.write_byte_data(self.address, register, value)
  92. def read_data(self):
  93. self.registers = self.i2cbus.read_i2c_block_data(self.address, 0x00)