AM2320.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #include "AM2320.h"
  2. #include <Wire.h>
  3. //
  4. // AM2321 Temperature & Humidity Sensor library for Arduino
  5. // Сделана Тимофеевым Е.Н. из AM2320-master
  6. unsigned int CRC16(byte *ptr, byte length)
  7. {
  8. unsigned int crc = 0xFFFF;
  9. uint8_t s = 0x00;
  10. while(length--) {
  11. crc ^= *ptr++;
  12. for(s = 0; s < 8; s++) {
  13. if((crc & 0x01) != 0) {
  14. crc >>= 1;
  15. crc ^= 0xA001;
  16. } else crc >>= 1;
  17. }
  18. }
  19. return crc;
  20. }
  21. AM2320::AM2320()
  22. {
  23. }
  24. int AM2320::Read()
  25. {
  26. byte buf[8];
  27. for(int s = 0; s < 8; s++) buf[s] = 0x00;
  28. Wire.beginTransmission(AM2320_address);
  29. Wire.endTransmission();
  30. // запрос 4 байт (температуры и влажности)
  31. Wire.beginTransmission(AM2320_address);
  32. Wire.write(0x03);// запрос
  33. Wire.write(0x00); // с 0-го адреса
  34. Wire.write(0x04); // 4 байта
  35. if (Wire.endTransmission(1) != 0) return 1;
  36. delayMicroseconds(1600); //>1.5ms
  37. // считываем результаты запроса
  38. Wire.requestFrom(AM2320_address, 0x08);
  39. for (int i = 0; i < 0x08; i++) buf[i] = Wire.read();
  40. // CRC check
  41. unsigned int Rcrc = buf[7] << 8;
  42. Rcrc += buf[6];
  43. if (Rcrc == CRC16(buf, 6)) {
  44. unsigned int temperature = ((buf[4] & 0x7F) << 8) + buf[5];
  45. t = temperature / 10.0;
  46. t = ((buf[4] & 0x80) >> 7) == 1 ? t * (-1) : t;
  47. unsigned int humidity = (buf[2] << 8) + buf[3];
  48. h = humidity / 10.0;
  49. return 0;
  50. }
  51. return 2;
  52. }