Advertisement
Guest User

Untitled

a guest
Nov 18th, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <EEPROM.h>
  2. #include <DallasTemperature.h>
  3. #include <OneWire.h>
  4. #include <Thread.h>
  5.  
  6. #define SMOKE_PIN  2
  7. #define FLAME_PIN  3
  8. #define TEMPERATURE_PIN  4
  9. #define BUTTON_PIN  5
  10. #define LIGHT_PIN  11
  11. #define RELAY_PIN  12
  12.  
  13. #define NO_DATA "-"
  14. #define LONG_PRESS_BUTTON 2000
  15. #define BLINK_DELAY 500
  16.  
  17. #define FLAME_ENABLED_POINTER   0
  18. #define SMOKE_ENABLED_POINTER   1
  19. #define TEMPERATURE_ENABLED_POINTER   2
  20. #define TEMPERATURE_POINTER   3
  21. #define DELAY_TIME_POINTER   5
  22. #define ALARM_LEVEL_POINTER   7
  23.  
  24. #define MAX_DELAY   10000
  25. #define MIN_ALARM_LEVEL 3
  26. OneWire oneWire(TEMPERATURE_PIN);
  27. DallasTemperature sensors(&oneWire);
  28.  
  29. bool flameEnabled;
  30. bool smokeEnabled;
  31. bool temperatureEnabled;
  32. int maxTemperature;
  33. int delayTime;
  34. byte alarmLevel;
  35.  
  36. bool debuging;
  37. bool alarm;
  38. bool flame;
  39. bool fire;
  40. bool smoke;
  41. bool temperatureHigh;
  42. int currentAlarmLevel;
  43. float currentTemperature;
  44.  
  45.  
  46. void setup(void) {
  47.   readConfig();
  48.   setPinsMode();
  49.   relayOff();
  50.   sensors.begin();
  51. }
  52.  
  53. void readConfig(void) {
  54.   flameEnabled = EEPROM.read(FLAME_ENABLED_POINTER);
  55.   smokeEnabled = EEPROM.read(SMOKE_ENABLED_POINTER);
  56.   temperatureEnabled = EEPROM.read(TEMPERATURE_ENABLED_POINTER);
  57.   maxTemperature = readInt(TEMPERATURE_POINTER);
  58.   delayTime = readInt(DELAY_TIME_POINTER);
  59.   if (delayTime > MAX_DELAY || delayTime < 0) {
  60.     delayTime = MAX_DELAY;
  61.     writeInt(DELAY_TIME_POINTER, delayTime);
  62.   }
  63.   alarmLevel = readInt(ALARM_LEVEL_POINTER);
  64.   if (alarmLevel > MIN_ALARM_LEVEL || alarmLevel <= 0) {
  65.     alarmLevel = 1;
  66.     writeInt(ALARM_LEVEL_POINTER, alarmLevel);
  67.   }
  68. }
  69.  
  70. void setPinsMode(void) {
  71.   pinMode(FLAME_PIN, INPUT );
  72.   pinMode(SMOKE_PIN, INPUT );
  73.   pinMode(RELAY_PIN, OUTPUT);
  74.   pinMode(BUTTON_PIN, INPUT );
  75.   pinMode(LIGHT_PIN, OUTPUT);
  76. }
  77.  
  78. void loop(void) {
  79.  
  80.   isFire();
  81.   if (fire) {
  82.     alarmOn();
  83.   }
  84.   if (alarm) {
  85.     if (digitalRead(BUTTON_PIN)) {
  86.       alarmOff();
  87.     }
  88.   }
  89.   if (digitalRead(BUTTON_PIN)) {
  90.     unsigned long startPressing = millis();
  91.     while (digitalRead(BUTTON_PIN)) {
  92.       if ( millis() - startPressing >= LONG_PRESS_BUTTON) {
  93.         debuging ? debugOff() : debugOn();
  94.         lightBlink();
  95.         break;
  96.       }
  97.     }
  98.   }
  99.   if (debuging) {
  100.     debug();
  101.   }
  102.   delay (delayTime);
  103. }
  104.  
  105. void lightBlink(void) {
  106.   digitalToggle(LIGHT_PIN);
  107.   delay (BLINK_DELAY);
  108.   digitalToggle(LIGHT_PIN);
  109.  
  110. }
  111. inline void digitalToggle(byte pin) {
  112.   digitalWrite(pin, !digitalRead(pin));
  113. }
  114. void isFire(void) {
  115.   isFlame();
  116.   isSmoke();
  117.   isTemperatureHigh();
  118.   currentAlarmLevel = 0;
  119.   if (flame) {
  120.     currentAlarmLevel++;
  121.   }
  122.   if (smoke) {
  123.     currentAlarmLevel++;
  124.   }
  125.   if (temperatureHigh) {
  126.     currentAlarmLevel++;
  127.   }
  128.   fire = currentAlarmLevel >= alarmLevel;
  129. }
  130.  
  131. void isFlame(void) {
  132.   if (flameEnabled) {
  133.     flame = digitalRead(FLAME_PIN) == LOW;
  134.     return;
  135.   }
  136.   flame = true;
  137. }
  138.  
  139. void isSmoke(void) {
  140.   if (smokeEnabled) {
  141.     smoke = digitalRead(SMOKE_PIN) == LOW;
  142.     return;
  143.   }
  144.   smoke = true;
  145. }
  146.  
  147. void isTemperatureHigh(void) {
  148.   if (temperatureEnabled) {
  149.     sensors.requestTemperatures();
  150.     currentTemperature = sensors.getTempCByIndex(0);
  151.     temperatureHigh = currentTemperature > maxTemperature;
  152.     return;
  153.   }
  154.   temperatureHigh = true;
  155. }
  156.  
  157. void relayOff() {
  158.   digitalWrite(RELAY_PIN, HIGH);
  159. }
  160.  
  161. void relayOn() {
  162.   digitalWrite(RELAY_PIN, LOW);
  163. }
  164.  
  165. void lightOn() {
  166.   digitalWrite(LIGHT_PIN, HIGH);
  167. }
  168.  
  169. void lightOff() {
  170.   digitalWrite(LIGHT_PIN, LOW);
  171. }
  172.  
  173. void alarmOn(void) {
  174.   alarm = true;
  175.   relayOn();
  176.   lightOn();
  177. }
  178.  
  179. void alarmOff(void) {
  180.   alarm = false;
  181.   relayOff();
  182.   lightOff();
  183. }
  184.  
  185. void debugOn(void) {
  186.   debuging = true;
  187.   Serial.begin(9600);
  188. }
  189.  
  190. void debugOff(void) {
  191.   debuging = false;
  192.   Serial.end();
  193. }
  194.  
  195. void debug(void) {
  196.   writeData();
  197. }
  198.  
  199. void writeData() {
  200.   Serial.println("Config                 | State");
  201.  
  202.   Serial.print("(A)larm level:       ");
  203.   Serial.print(alarmLevel);
  204.   Serial.print(" | ");
  205.   Serial.println(currentAlarmLevel);
  206.  
  207.   Serial.print("(F)lame alarm:       ");
  208.   Serial.print(flameEnabled);
  209.   Serial.print(" | ");
  210.   if (flameEnabled) {
  211.     Serial.println(flame);
  212.   } else {
  213.     Serial.println(NO_DATA);
  214.   }
  215.  
  216.   Serial.print("(S)moke alarm:       ");
  217.   Serial.print(smokeEnabled);
  218.   Serial.print(" | ");
  219.   if (smokeEnabled) {
  220.     Serial.println(smoke);
  221.   } else {
  222.     Serial.println(NO_DATA);
  223.   }
  224.  
  225.   Serial.print("(T)emperature alarm: ");
  226.   Serial.print(temperatureEnabled);
  227.   Serial.print(" | ");
  228.   if (temperatureEnabled) {
  229.     Serial.println(temperatureHigh);
  230.   } else {
  231.     Serial.println(NO_DATA);
  232.   }
  233.  
  234.   Serial.print("(M)ax temperature:   ");
  235.   Serial.print(maxTemperature);
  236.   Serial.print(" | ");
  237.   if (temperatureEnabled) {
  238.     Serial.println(currentTemperature);
  239.   } else {
  240.     Serial.println(NO_DATA);
  241.   }
  242.  
  243.   Serial.print("(D)elay time:        ");
  244.   Serial.print(delayTime);
  245.   Serial.print(" | ");
  246.   Serial.println(NO_DATA);
  247.  
  248.   Serial.print("Fire alarm:          ");
  249.   Serial.print(NO_DATA);
  250.   Serial.print(" | ");
  251.   Serial.println(alarm);
  252.  
  253.   Serial.println();
  254. }
  255.  
  256. void serialEvent() {
  257.   while (Serial.available() >= 3) {
  258.     char key = Serial.read();
  259.     int value = Serial.parseInt();
  260.     switch (key) {
  261.       case 'F':
  262.         flameEnabled = value;
  263.         EEPROM.write(FLAME_ENABLED_POINTER, flameEnabled);
  264.         break;
  265.       case 'S':
  266.         smokeEnabled = value;
  267.         EEPROM.write(SMOKE_ENABLED_POINTER, smokeEnabled);
  268.         break;
  269.       case 'T':
  270.         temperatureEnabled = value;
  271.         EEPROM.write(TEMPERATURE_ENABLED_POINTER, temperatureEnabled);
  272.         break;
  273.       case 'M':
  274.         maxTemperature = value;
  275.         writeInt(TEMPERATURE_POINTER, maxTemperature);
  276.         break;
  277.       case 'D':
  278.         delayTime = value;
  279.         writeInt(DELAY_TIME_POINTER, delayTime);
  280.         break;
  281.       case 'A':
  282.         alarmLevel = value;
  283.         writeInt(ALARM_LEVEL_POINTER, alarmLevel);
  284.         break;
  285.     }
  286.   }
  287.   Serial.readString();
  288. }
  289.  
  290. int readInt(int addr) {
  291.   byte raw[2];
  292.   for (byte i = 0; i < 2; i++) raw[i] = EEPROM.read(addr + i);
  293.   int &num = (int&)raw;
  294.   return num;
  295. }
  296.  
  297. void writeInt(int addr, int num) {
  298.   byte raw[2];
  299.   (int&)raw = num;
  300.   for (byte i = 0; i < 2; i++) EEPROM.write(addr + i, raw[i]);
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement