4-RELAY.ino 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. Description: Control 4 relays and demonstrate the asynchronous control relay LED
  3. */
  4. #include <M5Stack.h>
  5. /*-----------------------------------------------------------------------------*/
  6. // |RELAY control reg | 0x10
  7. // |-----------------------------------------------------------------------------
  8. // |Relay_ctrl_mode_reg[0] | R/W | System control
  9. // | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
  10. // | R | R | R | R | R | R | R | Sync Mode |
  11. // | -Sync Mode:0 LED&Relay Async
  12. // | -Sync Mode:1 LED&Relay Sync
  13. //---------------------------------------------------------------------------------
  14. // |Relay_ctrl_mode_reg[1] | R/W | Relay & LED control
  15. // | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
  16. // | LED1| LED2| LED3| LED4| RLY1| RLY2| RLY3| RLY4|
  17. //
  18. /*-------------------------------------------------------------------------------*/
  19. void WriteRelayReg( int regAddr, int data )
  20. {
  21. Wire.beginTransmission(0x26);
  22. Wire.write(regAddr);
  23. Wire.write(data);
  24. Wire.endTransmission();
  25. Serial.printf("[ W ] %02X : %02X. \r\n", regAddr, data);
  26. }
  27. int readRelayReg(int regAddr)
  28. {
  29. Wire.beginTransmission(0x26);
  30. Wire.write(regAddr);
  31. Wire.endTransmission();
  32. Wire.requestFrom(0x26, 1);
  33. int data = Wire.read() & 0x00ff;
  34. Serial.printf("[ R ] %02X : %02X. \r\n", regAddr, data);
  35. return data;
  36. }
  37. void WriteRelayNumber( int number, int state )
  38. {
  39. int StateFromDevice = readRelayReg(0x11);
  40. if( state == 0 )
  41. {
  42. StateFromDevice &= ~( 0x01 << number );
  43. }
  44. else
  45. {
  46. StateFromDevice |= ( 0x01 << number );
  47. }
  48. WriteRelayReg(0x11,StateFromDevice);
  49. }
  50. void setup() {
  51. // put your setup code here, to run once:
  52. M5.begin(true, true, true, true);
  53. M5.Lcd.setCursor(90, 0, 4);
  54. M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK);
  55. M5.Lcd.print("4-RELAY UNIT");
  56. M5.Lcd.setCursor(0, 220, 2);
  57. M5.Lcd.print("Independent Switch");
  58. M5.Lcd.setCursor(130, 220, 2);
  59. M5.Lcd.print("LED Sync/Async");
  60. M5.Lcd.setCursor(250, 220, 2);
  61. M5.Lcd.print("ALL Relay");
  62. M5.Lcd.setCursor(20, 50, 4);
  63. M5.Lcd.print("Relay State: ");
  64. M5.Lcd.setCursor(20, 80, 4);
  65. M5.Lcd.print("Sync Mode: ");
  66. readRelayReg(0x10);
  67. readRelayReg(0x11);
  68. WriteRelayReg(0x10,1);
  69. WriteRelayReg(0x11,0);
  70. //WriteRelayNumber(0,0);
  71. }
  72. int count_i = 0;
  73. bool flag_led, flag_relay = false;
  74. void loop() {
  75. if(M5.BtnA.wasPressed()){
  76. M5.Lcd.fillRect(160, 50, 100, 20, TFT_BLACK);
  77. M5.Lcd.setCursor(160, 50, 4);
  78. M5.Lcd.printf("%d ON", count_i);
  79. WriteRelayReg(0x11,(0x01 << count_i));
  80. count_i++;
  81. if( count_i >= 4 ) count_i = 0;
  82. }
  83. if(M5.BtnB.wasPressed()){
  84. M5.Lcd.fillRect(160, 80, 100, 20, TFT_BLACK);
  85. if(!flag_led){
  86. M5.Lcd.setCursor(160, 80, 4);
  87. M5.Lcd.print("Async");
  88. WriteRelayReg(0x10, 0);
  89. }else {
  90. M5.Lcd.setCursor(160, 80, 4);
  91. M5.Lcd.print("Sync");
  92. WriteRelayReg(0x10, 1);
  93. }
  94. flag_led = !flag_led;
  95. }
  96. if(M5.BtnC.wasPressed()){
  97. M5.Lcd.fillRect(160, 50, 100, 20, TFT_BLACK);
  98. for(int i=0; i<4; i++){
  99. if(!flag_relay) {
  100. M5.Lcd.setCursor(160, 50, 4);
  101. M5.Lcd.print("ON");
  102. WriteRelayNumber(i, 1);
  103. }else {
  104. M5.Lcd.setCursor(160, 50, 4);
  105. M5.Lcd.print("OFF");
  106. WriteRelayNumber(i, 0);
  107. }
  108. }
  109. flag_relay = !flag_relay;
  110. }
  111. M5.update();
  112. }