1

Dependencies:   mbed

Revision:
0:2a01c5a56ed1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/function.h	Mon Jul 09 09:12:38 2018 +0000
@@ -0,0 +1,1977 @@
+#ifndef FUNCTION_H
+#define FUNCTION_H
+
+/*
+    ****************************************************************************
+    ****************************************************************************
+    ** DEVINT BİLİŞİM YAZILIM DONANIM TİC. LTD. ŞTİ. TARAFINDAN GELİŞTİRİLMİŞTİR
+    ** İzmir / TÜRKİYE
+    **
+    ** Copyright (C) 2015
+    ****************************************************************************
+    ****************************************************************************
+    *************************************************************** K A M B O **
+*/
+
+// FONKSIYON PROTOTİPLERİ
+void configure_eeprom_default_values(void);
+//******************************************************************************
+
+void init_node(void);
+//******************************************************************************
+
+float read_pressure_dp(void);
+//******************************************************************************
+
+float read_pressure(void);
+//******************************************************************************
+
+void prepare_data(void);
+//******************************************************************************
+
+void prepare_data_fread(void);
+//******************************************************************************
+
+void send_to_coordinator(char* char_array);
+//******************************************************************************
+
+void process_command(uint8_t cmmnd);
+//******************************************************************************
+
+void data_transmit_isr(void);
+//******************************************************************************
+
+void rf_rx_isr(void);
+//******************************************************************************
+
+void master_rx_isr(void);
+//******************************************************************************
+
+bool open_solenoid(uint8_t filter_no);
+//******************************************************************************
+
+bool close_solenoid(uint8_t filter_no);
+//******************************************************************************
+
+float map(float x, float in_min, float in_max, float out_min, float out_max);
+//******************************************************************************
+
+void watermeter_isr(void);
+//******************************************************************************
+
+void flowrate_isr(void);
+//******************************************************************************
+
+void flush_phase_isr(void);
+//******************************************************************************
+
+void pressure_check_isr(void);
+//******************************************************************************
+
+bool check_and_close_valves(void);
+//******************************************************************************
+
+void periodic_flush_isr(void);
+//******************************************************************************
+
+void min_flush_interval_isr(void);
+//******************************************************************************
+
+void rt_data_transmit_isr(void);
+//******************************************************************************
+
+void send_alarm(uint8_t _alarmID, uint16_t _filterID, uint8_t _slaveID);
+//******************************************************************************
+
+bool send_command(uint8_t _slaveid, uint8_t _command, uint8_t _filterid);
+//******************************************************************************
+
+// FONKSIYONLAR
+float map(float x, float in_min, float in_max, float out_min, float out_max)
+{
+    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+}
+
+//
+bool check_and_close_valves()
+{
+    bool check = false;
+
+    for (uint8_t _slaveID = 0; _slaveID <= fnode.totalSlaveNumber - 1; _slaveID++) {
+
+        for (uint8_t _filterNo = 0; _filterNo < 5; _filterNo ++) {
+
+            if (send_command(_slaveID, CLOSE_SOLENOID, _filterNo)) {
+
+                check = true;
+                wait_ms(500);
+
+            } else {
+
+                check = false;
+
+            }
+
+            if (check == false) {
+                break;
+            }
+        }
+
+        if (check == false) {
+            break;
+        }
+    }
+
+    return check;
+}
+
+bool open_solenoid(uint8_t _filter_no)
+{
+    bool _success = false;
+
+    switch (_filter_no) {
+
+        case FILTER_1_SOLENOID: {                                            // OUT1
+
+            // İleri
+            fnode.filterByte_2 &= ~(1 << 6);                       // Bit 6 = 0
+            fnode.filterByte_1 = fnode.filterByte_1;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_2 &= ~(1 << 5);                       // Bit 5 = 0
+                fnode.filterByte_2 &= ~(1 << 4);                       // Bit 4 = 0
+                fnode.filterByte_1 = fnode.filterByte_1;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_2 |= 1 << 4;                          // Bit 4 = 1
+                    fnode.filterByte_2 |= 1 << 5;                          // Bit 5 = 1
+                    fnode.filterByte_1 = fnode.filterByte_1;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_2_SOLENOID: {                                            // OUT2
+
+            // İleri
+            fnode.filterByte_2 &= ~(1 << 3);                       // Bit 3 = 0
+            fnode.filterByte_1 = fnode.filterByte_1;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_2 &= ~(1 << 2);                       // Bit 2 = 0
+                fnode.filterByte_2 &= ~(1 << 1);                       // Bit 1 = 0
+                fnode.filterByte_1 = fnode.filterByte_1;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_2 |= 1 << 1;                          // Bit 1 is 1
+                    fnode.filterByte_2 |= 1 << 2;                          // Bit 2 is 1
+                    fnode.filterByte_1 = fnode.filterByte_1;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_3_SOLENOID: {                                            // OUT3
+
+            // İleri
+            fnode.filterByte_2 &= ~(1 << 0);                       // Bit 0 = 0
+            fnode.filterByte_1 = fnode.filterByte_1;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_1 &= ~(1 << 7);                       // Bit 7 = 0
+                fnode.filterByte_1 &= ~(1 << 6);                       // Bit 6 = 0
+                fnode.filterByte_2 = fnode.filterByte_2;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_1 |= 1 << 6;                          // Bit 6 = 1
+                    fnode.filterByte_1 |= 1 << 7;                          // Bit 7 = 1
+                    fnode.filterByte_2 = fnode.filterByte_2;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_4_SOLENOID: {                                            // OUT4
+
+            // İleri
+            fnode.filterByte_1 &= ~(1 << 5);                       // Bit 5 = 0
+            fnode.filterByte_2 = fnode.filterByte_2;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_1 &= ~(1 << 4);                       // Bit 4 = 0
+                fnode.filterByte_1 &= ~(1 << 3);                       // Bit 3 = 0
+                fnode.filterByte_2 = fnode.filterByte_2;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_1 |= 1 << 3;                          // Bit 3 = 1
+                    fnode.filterByte_1 |= 1 << 4;                          // Bit 4 = 0
+                    fnode.filterByte_2 = fnode.filterByte_2;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_MAIN_SOLENOID: {                                         // OUT5
+
+            // İleri
+            fnode.filterByte_1 &= ~(1 << 2);                       // Bit 2 = 0
+            fnode.filterByte_2 = fnode.filterByte_2;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_1 &= ~(1 << 1);                       // Bit 1 = 0
+                fnode.filterByte_1 &= ~(1 << 0);                       // Bit 0 = 0
+                fnode.filterByte_2 = fnode.filterByte_2;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_1 |= 1 << 0;                          // Bit 0 = 1
+                    fnode.filterByte_1 |= 1 << 1;                          // Bit 1 = 0
+                    fnode.filterByte_2 = fnode.filterByte_2;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+    }
+
+    return _success;
+}
+
+//
+bool close_solenoid(uint8_t _filter_no)
+{
+    bool _success = false;
+
+    switch (_filter_no) {
+
+        case FILTER_1_SOLENOID: {                                            // OUT1
+
+            // Geri
+            fnode.filterByte_2 |= 1 << 6;                          // Bit 6 = 1
+            fnode.filterByte_1 = fnode.filterByte_1;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_2 &= ~(1 << 5);                       // Bit 5 = 0
+                fnode.filterByte_2 &= ~(1 << 4);                       // Bit 4 = 0
+                fnode.filterByte_1 = fnode.filterByte_1;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_2 |= 1 << 4;                          // Bit 4 = 1
+                    fnode.filterByte_2 |= 1 << 5;                          // Bit 5 = 1
+                    fnode.filterByte_1 = fnode.filterByte_1;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_2_SOLENOID: {                                            // OUT2
+
+            // Geri
+            fnode.filterByte_2 |= 1 << 3;                          // Bit 3 = 1
+            fnode.filterByte_1 = fnode.filterByte_1;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_2 &= ~(1 << 2);                       // Bit 2 = 0
+                fnode.filterByte_2 &= ~(1 << 1);                       // Bit 1 = 0
+                fnode.filterByte_1 = fnode.filterByte_1;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_2 |= 1 << 1;                          // Bit 1 = 1
+                    fnode.filterByte_2 |= 1 << 2;                          // Bit 2 = 1
+                    fnode.filterByte_1 = fnode.filterByte_1;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_3_SOLENOID: {                                            // OUT3
+
+            // Geri
+            fnode.filterByte_2 |= 1 << 0;                          // Bit 0 = 1
+            fnode.filterByte_1 = fnode.filterByte_1;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_1 &= ~(1 << 7);                       // Bit 7 = 0
+                fnode.filterByte_1 &= ~(1 << 6);                       // Bit 6 = 0
+                fnode.filterByte_2 = fnode.filterByte_2;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_1 |= 1 << 6;                          // Bit 6 = 1
+                    fnode.filterByte_1 |= 1 << 7;                          // Bit 7 = 1
+                    fnode.filterByte_2 = fnode.filterByte_2;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_4_SOLENOID: {                                            // OUT4
+
+            // Geri
+            fnode.filterByte_1 |= 1 << 5;                          // Bit 5 = 1
+            fnode.filterByte_2 = fnode.filterByte_2;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_1 &= ~(1 << 4);                       // Bit 4 = 0
+                fnode.filterByte_1 &= ~(1 << 3);                       // Bit 3 = 0
+                fnode.filterByte_2 = fnode.filterByte_2;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_1 |= 1 << 3;                          // Bit 3 = 1
+                    fnode.filterByte_1 |= 1 << 4;                          // Bit 4 = 0
+                    fnode.filterByte_2 = fnode.filterByte_2;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+
+        case FILTER_MAIN_SOLENOID: {                                         // OUT5
+
+            // Geri
+            fnode.filterByte_1 |= 1 << 2;                          // Bit 2 = 1
+            fnode.filterByte_2 = fnode.filterByte_2;
+
+            if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                _success = true;
+
+                // H-köprüsünü aç ve uyandır
+                fnode.filterByte_1 &= ~(1 << 1);                       // Bit 1 = 0
+                fnode.filterByte_1 &= ~(1 << 0);                       // Bit 0 = 0
+                fnode.filterByte_2 = fnode.filterByte_2;
+
+                if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                    wait_ms(250);
+
+                    _success = true;
+
+                    // Uyut ve H-köprüsünü kapat
+                    fnode.filterByte_1 |= 1 << 0;                          // Bit 0 = 1
+                    fnode.filterByte_1 |= 1 << 1;                          // Bit 1 = 0
+                    fnode.filterByte_2 = fnode.filterByte_2;
+
+                    if (io_send(fnode.filterByte_1, fnode.filterByte_2) == true) {
+
+                        _success = true;
+
+                    } else {
+
+                        _success = false;
+
+                    }
+
+                } else {
+
+                    _success = false;
+
+                }
+
+            } else {
+
+                _success = false;
+
+            }
+        }
+        break;
+    }
+
+    return _success;
+}
+
+//
+void configure_eeprom_default_values()
+{
+    if (eeprom_read(EEPROM_TYPE, DEFAULT_CONFIG_ADDR) != 35) {
+
+        for (uint8_t i = 0; i < 99; i++) {
+
+            eeprom_write(EEPROM_TYPE, i, 0xFF);
+
+        }
+
+        eeprom_write(EEPROM_TYPE, DEFAULT_CONFIG_ADDR, 35);
+
+        eeprom_write(EEPROM_TYPE, SYSTEM_SETUP_ADDR, SYSTEM_SETUP_DEFAULT);
+        eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, AUTOSEND_STATUS_DEFAULT);
+        eeprom_write(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR, IRRI_TRANSMIT_INTERVAL_DEFAULT);
+        eeprom_write(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR, DRY_TRANSMIT_INTERVAL_DEFAULT);
+        eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1, WATERMETER_COEFF_DEFAULT >> 8);
+        eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2, WATERMETER_COEFF_DEFAULT & 0xFF);
+        eeprom_write(EEPROM_TYPE, PMAX_ADDR, PMAX_DEFAULT);
+        eeprom_write(EEPROM_TYPE, PRESSURE_SENSOR_ADDR, PRESSURE_SENSOR_DEFAULT);
+        eeprom_write(EEPROM_TYPE, DP_ADDR, DP_DEFAULT);
+        eeprom_write(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR, PRESSURE_CONTROL_FREQUENCY_DEFAULT);
+        eeprom_write(EEPROM_TYPE, FLUSH_DURATION_ADDR, FLUSH_DURATION_DEFAULT);
+        eeprom_write(EEPROM_TYPE, FLUSH_INTERVAL_ADDR, FLUSH_INTERVAL_DEFAULT);
+        eeprom_write(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR, FLOW_CONTROL_LATENCY_DEFAULT);
+        eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, FLUSH_ENABLE_DEFAULT);
+        eeprom_write(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR, PR_SENSOR_POSITION_DEFAULT);
+        eeprom_write(EEPROM_TYPE, BACKFLUSH_STOP_ADDR, BACKFLUSH_STOP_DEFAULT);
+        eeprom_write(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR, INLET_PRS_LOW_TRS_DEFAULT);
+        eeprom_write(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR, INLET_PRS_HIGH_TRS_DEFAULT);
+        eeprom_write(EEPROM_TYPE, ALARMS_ENABLE_ADDR, ALARMS_ENABLE_DEFAULT);
+        eeprom_write(EEPROM_TYPE, DP_HIGH_TRS_ADDR, DP_HIGH_TRS_DEFAULT);
+        eeprom_write(EEPROM_TYPE, INLET_PRS_SET_ADDR, INLET_PRS_SET_DEFAULT);
+        eeprom_write(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR, OUTLET_PRS_SET_FOR_DP_DEFAULT);
+        eeprom_write(EEPROM_TYPE, PERIODIC_FLUSH_ADDR, PERIODIC_FLUSH_DEFAULT);
+        eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1, MIN_FLUSH_INTERVAL_DEFAULT >> 8);
+        eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2, MIN_FLUSH_INTERVAL_DEFAULT & 0xFF);
+        eeprom_write(EEPROM_TYPE, FILTER_NUMBER_ADDR, FILTER_NUMBER_DEFAULT);
+    }
+}
+
+//
+void init_node()
+{
+    // EEPROM'dan sistem ayarlarını oku
+    fnode.systemSetup = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
+
+    // Filtre sayısını hesapla
+    fnode.filterNumber = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);
+    fnode.lastFlushPhase = ((uint16_t)fnode.filterNumber * 4) + 1;
+
+    // Sayaç mevcuts ISR'yi aktifle
+    if ((fnode.systemSetup >> 3) & 1 == 1) {
+
+        watermeterInterrupt.rise(&watermeter_isr);
+
+    }
+
+    // EEPROM'dan sulama sırasında veri gönderim sıklığını oku
+    fnode.irriTransmitInterval = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
+
+    // EEPROM'dan sulama dışında veri gönderim sıklığını oku
+    fnode.dryTransmitInterval = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
+
+    // EEPROM'dan otomatik veri gönderimini oku
+    if (eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR) == 1) {
+
+        fnode.autosend = true;
+
+    } else {
+
+        fnode.autosend = false;
+
+    }
+
+    if (eeprom_read(EEPROM_TYPE, IRRI_STATUS_ADDR) == 1) {
+
+        fnode.irrigation = true;
+
+        dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);
+
+        timer.reset();
+        timer.start();
+
+    } else {
+
+        fnode.irrigation = false;
+
+        dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);
+
+        timer.reset();
+        timer.start();
+
+    }
+
+    // EEPROM'dan sayaç katsayısını oku
+    fnode.watermeterCoefficient = (eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1) << 8) + eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
+
+    // EEPROM'dan basınç sensörünün okuyabileceği maksimum basıncı oku
+    fnode.pMax = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
+
+    // EEPROM'dan basınç sensörü tipini oku (4-20 mA veya 0-3.3v)
+    fnode.pressureSensorType = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
+
+    // EEPROM'dan DP set değerini oku
+    fnode.dpSet = eeprom_read(EEPROM_TYPE, DP_ADDR);
+
+    // EEPROM'dan basınç kontrol sıklığını oku
+    fnode.pressureControlFrequency = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
+
+    // EEPROM'dan 1 filtre yıkama süresini oku
+    fnode.flushDuration = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
+
+    // EEPROM'dan 2 filtre yıkaması arasındaki bekleme süresini oku
+    fnode.flushInterval = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
+
+    // EEPROM'dan akış kontrolü gecikme süresini oku (Akış kontrolü filtre yıkaması başladıktan ya da bittikten kaç saniye sonra yapılacak?)
+    fnode.flowControlLatency = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
+
+    // EEPROM'dan ters yıkama kontrolü aktif ya da pasif durumunu oku
+    if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 1) {
+
+        fnode.flushEnabled = 1;
+
+    } else {
+
+        fnode.flushEnabled = 0;
+
+    }
+
+    // EEPROM'dan basınç sensörünün yerleştirme noktasını oku (Filtre öncesi ya da sonrası)
+    fnode.pressureSensorPosition = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
+
+    // EEPROM'dan hata durumunda ters yıkamanın durdurulup durdurulmayacağını oku
+    if (eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR) == 0) {
+
+        fnode.onErrorStop = 0;
+
+    } else {
+
+        fnode.onErrorStop = 1;
+
+    }
+
+    fnode.pressureLowThreshold = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
+    fnode.pressureHighThreshold = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
+
+    // Timer ve tickerları başlat
+    // Basınç sürekli kontrol edilecek
+    pressureCheckTicker.attach(&pressure_check_isr, fnode.pressureControlFrequency);
+
+    // EEPROM'dan alarmların açık/kapalı durumunu oku
+    if (eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR) == 0) {
+
+        fnode.alarmsEnabled = 0;
+
+    } else {
+
+        fnode.alarmsEnabled = 1;
+
+    }
+
+    // EEPROM'dan DP alarmı eşik değerini oku
+    // Yıkama sırasında DP bu değerin üstüne çıkarsa alarm gönderilir
+    // Bazı durumlarda DP düşmeyebilir !!!
+    fnode.dpThreshold = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
+
+    // EEPROM'dan sulamanın başladığının anlaşılacağı giriş basıncı set değerini oku
+    fnode.inletPressureSet = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
+
+    // EEPROM'dan DP kontrolünün başlayacağı filtrasyon çıkış basıncı set değerini oku
+    fnode.outletPressureSet = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
+
+    // periodicFlushInterval değeri 0 ise periyodik yıkama yapılmaz
+    fnode.periodicFlushInterval = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
+
+    if (fnode.periodicFlushInterval == 0) {
+
+        fnode.periodicFlushEnabled = false;
+        periodicFlushTicker.detach();
+        fnode.periodicFlushCounter = 0;
+
+    } else {
+
+        fnode.periodicFlushEnabled = true;
+        fnode.periodicFlushCounter = 0;
+
+        // Periodic flush isr works every 1 second to increase periodicCounter by 1
+        // If periodicCounter value >= peridicFlushInterval * 3600
+        // Example:
+        // Periodic flush interval is 6 hours
+        // Periodic counter counts every 1 seconds by ISR
+        // In 1 hour there is 3600 seconds..... In 6 hours 6 * 3600 = 21600 seconds
+
+        if (fnode.irrigation == true) {
+
+            periodicFlushTicker.attach(&periodic_flush_isr, 1);                               // ISR set every 1 second
+
+        } else {
+
+            periodicFlushTicker.detach();
+
+        }
+    }
+
+    // minFlushInterval değeri 0'dan farklı ise DP yıkamaları min süre beklenerek yapılır
+    c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
+    c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
+    fnode.minFlushInterval = (c23_a << 8) + c23_b;
+
+    if (fnode.minFlushInterval == 0) {
+
+        fnode.minFlushEnabled = false;
+
+    } else {
+
+        fnode.minFlushEnabled = true;
+    }
+
+    if (fnode.filterNumber % 4 == 0) {
+
+        fnode.totalSlaveNumber = fnode.filterNumber / 4;
+
+    } else {
+
+        fnode.totalSlaveNumber = (fnode.filterNumber / 4) + 1;
+    }
+}
+
+//
+float read_pressure_dp()
+{
+    // Analog kanal okumasının RMS (Root Mean Square) hesaplaması
+    memset(rmsStore, 0, sizeof(rmsStore));
+    totalSampling = 0.0;
+    tempValue = 0.0;
+    tdp = 0.0;
+
+    for (uint8_t b = 0; b < RMS_SAMPLING_NUMBER; b++) {
+
+        tempValue = dpSensor.read();
+        rmsStore[b] = tempValue * tempValue;
+        totalSampling = totalSampling + rmsStore[b];
+
+    }
+
+    tdp = (sqrt ((float)((totalSampling / RMS_SAMPLING_NUMBER)))) * 4096.0f;
+    //
+
+    // Fark basınç hesaplaması, BAR, -4 ile +4 bar arası
+    // DP + 4 = ((Sensor okuması - 409.6) / 409.6) ==> Honeywell sensor katalog sadeleştirilmiş denklem
+    tdpResult = ((tdp-409.6f)/409.6f) - 4.0f;
+
+    if (tdpResult < 0) {
+
+        tdpResult = 0;
+
+    }
+
+    tdpResult = floor(tdpResult * 10) / 10;
+
+    return tdpResult;
+}
+
+//
+float read_pressure()
+{
+    // Analog kanal okumasının RMS (Root Mean Square) hesaplaması
+    memset(rmsStore, 0, sizeof(rmsStore));
+    totalSampling = 0;
+    tempValue = 0;
+    tp = 0;
+
+    for (uint8_t b = 0; b < RMS_SAMPLING_NUMBER; b++) {
+
+        tempValue = pressureSensor.read();
+        rmsStore[b] = tempValue * tempValue;
+        totalSampling = totalSampling + rmsStore[b];
+
+    }
+
+    tp = (sqrt ((float)((totalSampling / RMS_SAMPLING_NUMBER)))) * 4096.0f;
+    //
+
+    if (fnode.pressureSensorType == 0) {
+
+        // Ham analog verisinden basınç hesaplaması, BAR
+        // Honeywell Truw Stability sensörlerine özel, PSI, 3.3v, map'lenmemiş
+        tp = ((tp - 409.6f) / (3276.8f / (float)fnode.pMax)) * 0.0689476f; // 0.0689 is for psi to bar conversion;
+
+    } else {
+
+        // Ham analog verisinden basınç hesaplaması, BAR
+        // 4-20 mA sensöre özel, BAR
+        // 4 mA = 480 mV = 595.8 RAW
+        // 20 mA = 2400 mV = 2978.9 RAW
+        tp = map (tp, 595.8f, 2978.9f, 0.0f, (float)fnode.pMax);
+
+    }
+
+    if (tp < 0) {
+
+        tp = 0;
+
+    }
+
+    tp = floor(tp * 10) / 10;
+
+    return tp;
+}
+
+void prepare_data_fread()
+{
+    memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    // Filtrasyon JSON headırını yaz
+    sprintf(fnode.temporaryBuffer, "%s", json[0]);
+    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    // Eğer basınç sensörü varsa
+    if (fnode.systemSetup & (1 << 1)) {
+
+        // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
+        if (fnode.systemSetup & (1 << 1)) {
+
+            sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
+            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            // Basınç sensörü varken DP sensörü yoksa basınç sensörünün pozisyonuna göre giriş veya çıkış basıncını yaz
+        } else {
+
+            // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
+            if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {
+
+                sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+                // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
+            } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {
+
+                sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            }
+        }
+
+        // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+    }
+
+    // Eğer DP sensörü varsa DP verisini ekle
+    if (fnode.systemSetup & (1 << 1)) {
+
+        sprintf(fnode.temporaryBuffer, "%s%.1f%c", jsonHeader[2], fnode.dpPressure, ',');
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+        // DP sensörü yoksa DP verisi NULL olsun
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s%s%c", jsonHeader[2], "null", ',');
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    // Eğer sayaç mevcutsa su hacmi ve debi verilerini ekle
+    // İki veri gönderimi arasındaki su hacmi ve debi verisini burada hesapla
+    if (fnode.systemSetup & (1 << 3)) {
+
+        sprintf(fnode.temporaryBuffer, "%s%llu%c%s%llu%c%s%.1f%c%s%llu%c%s%llu%c%s%.1f", jsonHeader[3], fnode.rWI, ',', jsonHeader[4], fnode.rWIC, ',', jsonHeader[5], fnode.rQI, ',', jsonHeader[6], fnode.rWD, ',', jsonHeader[7], fnode.rWDC, ',', jsonHeader[8], fnode.rQD);
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c%s%s%c%s%s%c%s%s%c%s%s", jsonHeader[3], "null", ',', jsonHeader[4], "null", ',', jsonHeader[5], "null", ',', jsonHeader[6], "null", ',', jsonHeader[7], "null", ',', jsonHeader[8], "null");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    // Sulama durumu
+    if (fnode.irrigation == true) {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    // Yıkama durumu
+    if (fnode.flushing == true) {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    sprintf(fnode.temporaryBuffer, "%s", "},RT:1}");
+
+    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+}
+
+
+//
+void prepare_data()
+{
+    memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    // Filtrasyon JSON headırını yaz
+    sprintf(fnode.temporaryBuffer, "%s", json[0]);
+    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    // Eğer basınç sensörü varsa
+    if (fnode.systemSetup & (1 << 1)) {
+
+        // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
+        if (fnode.systemSetup & (1 << 0)) {
+
+            sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
+            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            // Basınç sensörü varken DP sensörü yoksa basınç sensörünün pozisyonuna göre giriş veya çıkış basıncını yaz
+        } else {
+
+            // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
+            if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {
+
+                sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+                // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
+            } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {
+
+                sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            }
+        }
+
+        // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+    }
+
+    // Eğer DP sensörü varsa DP verisini ekle
+    if (fnode.systemSetup & (1 << 0)) {
+
+        sprintf(fnode.temporaryBuffer, "%s%.1f%c", jsonHeader[2], fnode.dpPressure, ',');
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+        // DP sensörü yoksa DP verisi NULL olsun
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s%s%c", jsonHeader[2], "null", ',');
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    // Eğer sayaç mevcutsa su hacmi ve debi verilerini ekle
+    // İki veri gönderimi arasındaki su hacmi ve debi verisini burada hesapla
+    if (fnode.systemSetup & (1 << 3)) {
+
+        sprintf(fnode.temporaryBuffer, "%s%llu%c%s%llu%c%s%.1f%c%s%llu%c%s%llu%c%s%.1f", jsonHeader[3], fnode.WI, ',', jsonHeader[4], fnode.WIC, ',', jsonHeader[5], fnode.QI, ',', jsonHeader[6], fnode.WD, ',', jsonHeader[7], fnode.WDC, ',', jsonHeader[8], fnode.QD);
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c%s%s%c%s%s%c%s%s%c%s%s", jsonHeader[3], "null", ',', jsonHeader[4], "null", ',', jsonHeader[5], "null", ',', jsonHeader[6], "null", ',', jsonHeader[7], "null", ',', jsonHeader[8], "null");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    // Sulama durumu
+    if (fnode.irrigation == true) {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    // Yıkama durumu
+    if (fnode.flushing == true) {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    } else {
+
+        sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
+        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+    }
+
+    sprintf(fnode.temporaryBuffer, "%s", "}}");
+
+    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+}
+
+//
+void send_to_coordinator(char* char_array)
+{
+    rf.putc(COORD_ADDR_1);
+    rf.putc(COORD_ADDR_2);
+    rf.putc(EQUAL);
+    rf.puts(char_array);
+    rf.putc(CR);
+    wait_ms(50);
+}
+
+//
+void process_command(uint8_t cmnd)
+{
+    switch(cmnd) {
+
+        case FENABLE: {
+
+            // Eğer ters yıkama zaten akitflenmişse hata mesajı gönder
+            if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 1) {
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FENABLEERR\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+                // Ters yıkamayı devre dışı bırak
+            } else {
+
+                // Yıkamanın devreye alındığını EEPROM'a yaz
+                eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, 1);
+
+                fnode.flushEnabled = 1;
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FENABLEOK\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+        }
+        break;
+
+        case FDISABLE: {
+
+            // Eğer ters yıkama zaten akitflenmişse hata mesajı gönder
+            if (eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR) == 0) {
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FDISABLEERR\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+                // Ters yıkamayı devre dışı bırak
+            } else {
+
+                // Yıkamanın devre dışı kaldığını EEPROM'a yaz
+                eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, 0);
+
+                fnode.flushEnabled = 0;
+
+                /*
+                // Yıkama zamanlayıcısını kapat
+                flushTimer.detach();
+
+                // Yıkama fazını sıfırla
+                fnode.flushPhase = 0;
+
+                // Solenoid vanaları kontrol et ve kapat
+                check_and_close_valves();
+                */
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FDISABLEOK\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+        }
+        break;
+
+        case FSETSYS: {
+
+            // Sistem ayarları
+            eeprom_write(EEPROM_TYPE, SYSTEM_SETUP_ADDR, fnode.systemSetup);
+
+            // Otomatik veri aktarımı
+            eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, fnode.autosendStatus);
+
+            // Yeni set edilecek veri aktarım aralıkları eskisinden farklıysa zamanlayıcıları yeni ayarla başlat
+            // Eski ile yeni aktarım aralıkları aynı ise değişiklik yapma (Alt satırlarda)
+            irriTrsIntOld = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
+            eeprom_write(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR, fnode.irriTransmitInterval);
+
+            dryTrsIntOld = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
+            eeprom_write(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR, fnode.dryTransmitInterval);
+
+            // Sayaç katsayısı
+            eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1, fnode.watermeterCoefficient >> 8);
+            eeprom_write(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2, fnode.watermeterCoefficient & 0xFF);
+
+            // Basınç sensörü maksimum basıncı
+            eeprom_write(EEPROM_TYPE, PMAX_ADDR, fnode.pMax);
+
+            // Basınç sensörü tipi
+            eeprom_write(EEPROM_TYPE, PRESSURE_SENSOR_ADDR, fnode.pressureSensorType);
+
+            // DP set
+            eeprom_write(EEPROM_TYPE, DP_ADDR, fnode.dpSet);
+
+            // Basınç kontrol sıklığı
+            eeprom_write(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR, fnode.pressureControlFrequency);
+
+            // 1 filtre yıkama süresi
+            eeprom_write(EEPROM_TYPE, FLUSH_DURATION_ADDR, fnode.flushDuration);
+
+            // Yıkama aralığı
+            eeprom_write(EEPROM_TYPE, FLUSH_INTERVAL_ADDR, fnode.flushInterval);
+
+            // Akış kontrol gecikmesi
+            eeprom_write(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR, fnode.flowControlLatency);
+
+            // Ters yıkama devrede/devrede değil
+            eeprom_write(EEPROM_TYPE, FLUSH_ENABLE_ADDR, fnode.flushEnabled);
+
+            // Basınç sensörü pozisyonu
+            eeprom_write(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR, fnode.pressureSensorPosition);
+
+            // Hata durumunda ters yıkamayı durdur/durdurma
+            eeprom_write(EEPROM_TYPE, BACKFLUSH_STOP_ADDR, fnode.onErrorStop);
+
+            // Giriş basıncı alarm alt sınır eşik
+            eeprom_write(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR, fnode.pressureLowThreshold);
+
+            // Giriş basıncı alarm üst sınır eşik
+            eeprom_write(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR, fnode.pressureHighThreshold);
+
+            // Alarmlar devrede
+            eeprom_write(EEPROM_TYPE, ALARMS_ENABLE_ADDR, fnode.alarmsEnabled);
+
+            // DP alarm eşik değeri
+            eeprom_write(EEPROM_TYPE, DP_HIGH_TRS_ADDR, fnode.dpThreshold);
+
+            eeprom_write(EEPROM_TYPE, INLET_PRS_SET_ADDR, fnode.inletPressureSet);
+
+            eeprom_write(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR, fnode.outletPressureSet);
+
+            eeprom_write(EEPROM_TYPE, PERIODIC_FLUSH_ADDR, fnode.periodicFlushInterval);
+
+            eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1, fnode.minFlushInterval >> 8);
+            eeprom_write(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2, fnode.minFlushInterval & 0xFF);
+
+            eeprom_write(EEPROM_TYPE, FILTER_NUMBER_ADDR, fnode.filterNumber);
+
+
+            // Check written SSETSYS values on EEPROM
+            c1 = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
+            c2 = eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR);
+            c3 = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
+            c4 = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
+            c5_a = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1);
+            c5_b = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
+            c5 = (c5_a << 8) + c5_b;
+            c6 = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
+            c7 = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
+            c8 = eeprom_read(EEPROM_TYPE, DP_ADDR);
+            c9 = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
+            c10 = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
+            c11 = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
+            c12 = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
+            c13 = eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR);
+            c14 = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
+            c15 = eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR);
+            c16 = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
+            c17 = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
+            c18 = eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR);
+            c19 = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
+            c20 = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
+            c21 = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
+            c22 = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
+            c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
+            c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
+            c23 = (c23_a << 8) + c23_b;
+            c24 = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);
+
+            // Kaydedilen değerler ile gönderilen değerleri karşılaştır
+            // Aynı ise sunucuya mesaj gönder
+            if (c1 == fnode.systemSetup && c2 == fnode.autosendStatus && c3 == fnode.irriTransmitInterval && c4 == fnode.dryTransmitInterval && c5 == fnode.watermeterCoefficient && c6 == fnode.pMax && c7 == fnode.pressureSensorType && c8 == fnode.dpSet && c9 == fnode.pressureControlFrequency && c10 == fnode.flushDuration && c11 == fnode.flushInterval && c12 == fnode.flowControlLatency && c13 == fnode.flushEnabled && c14 == fnode.pressureSensorPosition && c15 == fnode.onErrorStop && c16 == fnode.pressureLowThreshold && c17 == fnode.pressureHighThreshold && c18 == fnode.alarmsEnabled && c19 == fnode.dpThreshold && c20 == fnode.inletPressureSet && c21 == fnode.outletPressureSet && c22 == fnode.periodicFlushInterval && c23 == fnode.minFlushInterval && c24 == fnode.filterNumber) {
+
+                sprintf(fnode.dataBuffer, "%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%c", "{CMD:\"FSETSYSOK\",C1:", c1, ",C2:", c2, ",C3:", c3, ",C4:", c4, ",C5:", c5, ",C6:", c6, ",C7:", c7, ",C8:", c8, ",C9:", c9, ",C10:", c10, ",C11:", c11, ",C12:", c12, ",C13:", c13, ",C14:", c14, ",C15:", c15, ",C16:", c16, ",C17:", c17, ",C18:", c18, ",C19:", c19, ",C20:", c20, ",C21:", c21, ",C22:", c22, ",C23:", c23, ",C24:", c24, '}');
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+                // YENİ SET Değerlerine göre ayarlar
+                // Filtre sayısı
+                fnode.filterNumber = c24;
+                fnode.lastFlushPhase = ((uint16_t)fnode.filterNumber * 4) + 1;
+
+                // Sayaç mevcutsa ISR'yi aktifle
+                if (fnode.systemSetup & (1 << 3)) {
+
+                    watermeterInterrupt.rise(NULL);
+                    watermeterInterrupt.rise(&watermeter_isr);
+
+                } else {
+
+                    watermeterInterrupt.rise(NULL);
+                }
+
+                if (fnode.autosendStatus == 0) {
+
+                    fnode.autosend = false;
+
+                } else {
+
+                    fnode.autosend = true;
+                }
+
+                // If irrigation phase and autosend is active and new data transmission interval is different than old one attach data transmission ISR again
+                if (fnode.irrigation == true && fnode.autosend == true && irriTrsIntOld != fnode.irriTransmitInterval) {
+
+                    dataTransmitTicker.detach();
+                    dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);
+
+                    // If not irrigation phase and autosend is active and new data transmission interval is different than old one attach data transmission ISR again
+                } else if (fnode.irrigation == false && fnode.autosend == true && dryTrsIntOld != fnode.dryTransmitInterval) {
+
+                    dataTransmitTicker.detach();
+                    dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);
+
+                    // If autosend is not active detach data transmission ISR
+                } else if (fnode.autosend == false) {
+
+                    dataTransmitTicker.detach();
+
+                }
+
+                // periodicFlushInterval değeri 0 ise periyodik yıkama yapılmaz
+                if (fnode.periodicFlushInterval == 0) {
+
+                    fnode.periodicFlushEnabled = false;
+                    periodicFlushTicker.detach();
+                    fnode.periodicFlushCounter = 0;
+
+                } else {
+
+                    fnode.periodicFlushEnabled = true;
+                    fnode.periodicFlushCounter = 0;
+
+                    // Periodic flush isr works every 1 second to increase periodicCounter by 1
+                    // If periodicCounter value >= peridicFlushInterval * 3600
+                    // Example:
+                    // Periodic flush interval is 6 hours
+                    // Periodic counter counts every 1 seconds by ISR
+                    // In 1 hour there is 3600 seconds..... In 6 hours 6 * 3600 = 21600 seconds
+
+                    if (fnode.irrigation == true) {
+
+                        periodicFlushTicker.attach(&periodic_flush_isr, 1);                               // ISR set every 1 second
+
+                    } else {
+
+                        periodicFlushTicker.detach();
+
+                    }
+                }
+
+                // minFlushInterval değeri 0'dan farklı ise DP yıkamaları min süre beklenerek yapılır
+                if (fnode.minFlushInterval == 0) {
+
+                    fnode.minFlushEnabled = false;
+
+                } else {
+
+                    fnode.minFlushEnabled = true;
+                }
+
+            } else {
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSETSYSERR\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+        }
+        break;
+
+        case FGETCFG: {
+
+            // Get configuration from EEPROM
+            c1 = eeprom_read(EEPROM_TYPE, SYSTEM_SETUP_ADDR);
+            c2 = eeprom_read(EEPROM_TYPE, AUTOSEND_STATUS_ADDR);
+            c3 = eeprom_read(EEPROM_TYPE, IRRI_TRANSMIT_INTERVAL_ADDR);
+            c4 = eeprom_read(EEPROM_TYPE, DRY_TRANSMIT_INTERVAL_ADDR);
+            c5_a = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_1);
+            c5_b = eeprom_read(EEPROM_TYPE, WATERMETER_COEFF_ADDR_2);
+            c5 = (c5_a << 8) + c5_b;
+            c6 = eeprom_read(EEPROM_TYPE, PMAX_ADDR);
+            c7 = eeprom_read(EEPROM_TYPE, PRESSURE_SENSOR_ADDR);
+            c8 = eeprom_read(EEPROM_TYPE, DP_ADDR);
+            c9 = eeprom_read(EEPROM_TYPE, PRESSURE_CONTROL_FREQUENCY_ADDR);
+            c10 = eeprom_read(EEPROM_TYPE, FLUSH_DURATION_ADDR);
+            c11 = eeprom_read(EEPROM_TYPE, FLUSH_INTERVAL_ADDR);
+            c12 = eeprom_read(EEPROM_TYPE, FLOW_CONTROL_LATENCY_ADDR);
+            c13 = eeprom_read(EEPROM_TYPE, FLUSH_ENABLE_ADDR);
+            c14 = eeprom_read(EEPROM_TYPE, PR_SENSOR_POSITION_ADDR);
+            c15 = eeprom_read(EEPROM_TYPE, BACKFLUSH_STOP_ADDR);
+            c16 = eeprom_read(EEPROM_TYPE, INLET_PRS_LOW_TRS_ADDR);
+            c17 = eeprom_read(EEPROM_TYPE, INLET_PRS_HIGH_TRS_ADDR);
+            c18 = eeprom_read(EEPROM_TYPE, ALARMS_ENABLE_ADDR);
+            c19 = eeprom_read(EEPROM_TYPE, DP_HIGH_TRS_ADDR);
+            c20 = eeprom_read(EEPROM_TYPE, INLET_PRS_SET_ADDR);
+            c21 = eeprom_read(EEPROM_TYPE, OUTLET_PRS_SET_FOR_DP_ADDR);
+            c22 = eeprom_read(EEPROM_TYPE, PERIODIC_FLUSH_ADDR);
+            c23_a = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_1);
+            c23_b = eeprom_read(EEPROM_TYPE, MIN_FLUSH_INTERVAL_ADDR_2);
+            c23 = (c23_a << 8) + c23_b;
+            c24 = eeprom_read(EEPROM_TYPE, FILTER_NUMBER_ADDR);
+
+            sprintf(fnode.dataBuffer, "%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%s%d%c", "{CMD:\"FGETCFGOK\",C1:", c1, ",C2:", c2, ",C3:", c3, ",C4:", c4, ",C5:", c5, ",C6:", c6, ",C7:", c7, ",C8:", c8, ",C9:", c9, ",C10:", c10, ",C11:", c11, ",C12:", c12, ",C13:", c13, ",C14:", c14, ",C15:", c15, ",C16:", c16, ",C17:", c17, ",C18:", c18, ",C19:", c19, ",C20:", c20, ",C21:", c21,  ",C22:", c22, ",C23:", c23, ",C24:", c24, '}');
+            send_to_coordinator(fnode.dataBuffer);
+            memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+        }
+        break;
+
+        case FSTART: {
+
+            if (fnode.autosend == false) {
+
+                fnode.autosend = true;
+
+                if (fnode.irrigation) {
+
+                    dataTransmitTicker.detach();
+                    dataTransmitTicker.attach(&data_transmit_isr, fnode.irriTransmitInterval * 60);
+
+                } else {
+
+                    dataTransmitTicker.detach();
+                    dataTransmitTicker.attach(&data_transmit_isr, fnode.dryTransmitInterval * 60);
+
+                }
+
+                // Save autosend enable status to EEPROM
+                eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 1);
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTARTOK\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            } else {
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTARTERR\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+
+        }
+        break;
+
+
+        case FSTOP: {
+
+            if (fnode.autosend == true) {
+
+                fnode.autosend = false;
+
+                dataTransmitTicker.detach();
+
+                // Save autosend disable status to EEPROM
+                eeprom_write(EEPROM_TYPE, AUTOSEND_STATUS_ADDR, 0);
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTOPOK\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            } else {
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FSTOPERR\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+        }
+        break;
+
+        case FFIX: {
+
+            if (fnode.errorOccured == true) {
+
+                fnode.errorOccured = false;
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FFIXOK\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            } else {
+
+                sprintf(fnode.dataBuffer, "%s", "{CMD:\"FFIXERR\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+        }
+        break;
+
+        case FGETSTATUS: {
+
+            //STAT:"IRR"
+            if (fnode.irrigation == true) {
+
+                sprintf(fnode.dataBuffer, "%s", "{STAT:\"IRR\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+                //STAT:"DRY"
+            } else {
+
+                sprintf(fnode.dataBuffer, "%s", "{STAT:\"DRY\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+
+        }
+        break;
+
+        case FGETFSTATUS: {
+
+            // Flushing Now
+            if(fnode.flushing) {
+                sprintf(fnode.dataBuffer, "%s", "{STAT:\"FLUSHING\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            } else {
+
+                sprintf(fnode.dataBuffer, "%s", "{STAT:\"NOTFLUSHING\"}");
+                send_to_coordinator(fnode.dataBuffer);
+                memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+            }
+        }
+        break;
+
+        case FFGETSTAT: {
+
+            memset(fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            // Filtrasyon JSON headırını yaz
+            //sprintf(fnode.temporaryBuffer, "%s", json[0]);
+            sprintf(fnode.temporaryBuffer, "%s", "{STAT:{");
+            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+            
+            fnode.pressure = read_pressure();
+            fnode.dpPressure = read_pressure_dp();
+
+            // Eğer basınç sensörü filtre girişinde ise basınç ve DP değerine göre giriş ve çıkış basıncını hesapla
+            // Giriş basıncı = Okunan basınç
+            // Çıkış basıncı = Okunan basınç - Fark basınç
+            if (fnode.pressureSensorPosition == 0) {
+
+                fnode.inletPressure = fnode.pressure;
+                fnode.outletPressure = fnode.pressure - fnode.dpPressure;
+
+                if (fnode.outletPressure < 0) {
+
+                    fnode.outletPressure = 0;
+
+                }
+
+                // Eğer basınç sensörü filtre çıkışında ise basınç ve DP değerine göre giriş ve çıkış basıncını hesapla
+                // Giriş basıncı = Okunan basınç + Fark basınç
+                // Çıkış basıncı = Okunan basınç
+            } else {
+
+                fnode.inletPressure = fnode.pressure + fnode.dpPressure;
+                fnode.outletPressure = fnode.pressure;
+
+            }
+
+            // Eğer basınç sensörü varsa
+            if (fnode.systemSetup & (1 << 1)) {
+
+                // Basınç sensörü varken DP sensörü de mevcutsa hem giriş hem çıkış basıncını yaz
+                if (fnode.systemSetup & (1 << 1)) {
+
+                    sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%.1f%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], fnode.outletPressure, ',');
+                    strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                    memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+                    // Basınç sensörü varken DP sensörü yoksa basınç sensörünün pozisyonuna göre giriş veya çıkış basıncını yaz
+                } else {
+
+                    // Basınç sensörü girişte ise giriş basıncını yaz, çıkış basıncı NULL olsun
+                    if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 0) {
+
+                        sprintf(fnode.temporaryBuffer, "%s%.1f%c%s%s%c", jsonHeader[0], fnode.inletPressure, ',', jsonHeader[1], "null", ',');
+                        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+                        // Basınç sensörü çıkışta ise çıkış basıncını yaz, giriş basıncı NULL olsun
+                    } else if (fnode.systemSetup & (1 << 1) && fnode.pressureSensorPosition == 1) {
+
+                        sprintf(fnode.temporaryBuffer, "%s%s%c%s%.1f%c", jsonHeader[0], "null", ',', jsonHeader[1], fnode.outletPressure, ',');
+                        strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                        memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+                    }
+                }
+
+                // Basınç sensörü yoksa giriş ve çıkış basınç değerleri NULL olsun
+            } else {
+
+                sprintf(fnode.temporaryBuffer, "%s%s%c%s%s%c", jsonHeader[0], "null", ',', jsonHeader[1], "null", ',');
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+            }
+
+            // Eğer DP sensörü varsa DP verisini ekle
+            if (fnode.systemSetup & (1 << 1)) {
+
+                sprintf(fnode.temporaryBuffer, "%s%.1f", jsonHeader[2], fnode.dpPressure);
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+                // DP sensörü yoksa DP verisi NULL olsun
+            } else {
+
+                sprintf(fnode.temporaryBuffer, "%s%s", jsonHeader[2], "null");
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            }
+
+
+            // Sulama durumu
+            if (fnode.irrigation == true) {
+
+                sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"IRR\"");
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            } else {
+
+                sprintf(fnode.temporaryBuffer, "%s", ",STAT:\"DRY\"");
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            }
+
+            // Yıkama durumu
+            if (fnode.flushing == true) {
+
+                sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:1");
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            } else {
+
+                sprintf(fnode.temporaryBuffer, "%s", ",FSTAT:0");
+                strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+                memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+
+            }
+
+            sprintf(fnode.temporaryBuffer, "%s", "},RT:1}");
+
+            strcat(fnode.dataBuffer, fnode.temporaryBuffer);
+            memset (fnode.temporaryBuffer, 0, sizeof(fnode.temporaryBuffer));
+            
+            send_to_coordinator(fnode.dataBuffer);
+            memset (fnode.dataBuffer, 0, sizeof(fnode.dataBuffer));
+
+        }
+        break;
+
+        // Elle yıkamayı başlat
+        case FLUSHNOW: {
+
+            // Eğer zaten yıkama varsa
+            if(fnode.flushing == true) {
+
+                send_alarm(ALREADY_FLUSHING, fnode.globalFlushingFilter, fnode.currentWorkingSlave);
+
+                // Yıkama yoksa başla
+            } else if (fnode.flushEnabled == 1 && fnode.errorOccured == false) {
+
+                    periodicFlushTicker.detach();
+                    fnode.periodicFlushCounter = 0;
+
+                    fnode.flushing = true;
+                    fnode.flushStarted = true;
+                    fnode.checkDp = false;
+
+                    minFlushTicker.detach();
+                    fnode.minFlushCounter = 0;
+                    fnode.isMinTimePassed = false;
+
+                    fnode.globalFlushPhase = 1;
+                    fnode.currentFlushPhase = 1;
+                    fnode.globalFlushingFilter = 1;
+                    fnode.currentFlushingFilter = 1;
+                    fnode.currentWorkingSlave = 0;
+
+                    send_alarm(BACKFLUSH_MANUAL_STARTED, fnode.globalFlushingFilter, fnode.currentWorkingSlave);
+
+            } else if (fnode.flushEnabled == 0 && fnode.errorOccured == false) {
+
+                send_alarm(FLUSH_DISABLED, fnode.globalFlushingFilter, fnode.currentWorkingSlave);
+
+            }
+        }
+        break;
+    }
+}
+
+bool send_command(uint8_t _slaveid, uint8_t _command, uint8_t _filterid)
+{
+    bool _ackinit = false;
+
+    if (_slaveid == MASTER_ID) {
+
+        if (_command == OPEN_SOLENOID || _command == TEST_OPEN_SOLENOID) {
+
+            if (open_solenoid(_filterid) == true) {
+
+                _ackinit = true;
+
+            }
+
+        } else if (_command == CLOSE_SOLENOID || _command == TEST_CLOSE_SOLENOID) {
+
+            if (close_solenoid(_filterid)) {
+
+                _ackinit = true;
+
+            }
+        }
+
+    } else {
+
+        fnode.masterTxBuffer[0] = MASTER_ID;
+        fnode.masterTxBuffer[1] = _slaveid;
+        fnode.masterTxBuffer[2] = _command;
+        fnode.masterTxBuffer[3] = _filterid;
+        fnode.masterTxBuffer[4] = 0x0D;
+
+        for (uint8_t i = 0; i < sizeof(fnode.masterTxBuffer); i++) {
+
+            for (uint8_t j = 0; j < 3; j++) {
+
+                if (master.putc(fnode.masterTxBuffer[i]) == fnode.masterTxBuffer[i]) {
+
+                    _ackinit = true;
+
+                } else {
+
+                    _ackinit = false;
+
+                }
+
+                if (_ackinit == true) {
+
+                    break;
+
+                }
+            }
+
+            if (_ackinit == false) {
+
+                break;
+
+            }
+        }
+
+        // Slave'den cevap tamamlanıncaya/gelinceye kadar bekle (ISR ile tamamlanır)
+        while (fnode.masterInterruptComplete != true) {}
+
+        if (fnode.masterInterruptComplete == true) {
+
+            if (fnode.masterRxBuffer[0] == _OK_) {
+
+                _ackinit = true;
+
+            } else {
+
+                _ackinit  = false;
+
+            }
+        }
+
+
+        memset (fnode.masterRxBuffer, 0, sizeof(fnode.masterRxBuffer));
+        master.attach(&master_rx_isr, Serial::RxIrq);
+
+        fnode.masterInterruptComplete = false;
+    }
+
+    return _ackinit;
+}
+
+// Data aktarım ISR
+void data_transmit_isr()
+{
+    fnode.transmitData = true;
+}
+
+// RF Rx ISR
+void rf_rx_isr()
+{
+    fnode.rfBufferChar = rf.getc();
+
+    if (fnode.rfBufferChar != '\r') {
+
+        fnode.rfBuffer[fnode.rfBufferCounter] = fnode.rfBufferChar;
+        fnode.rfBufferCounter++;
+
+    } else if (fnode.rfBufferChar == '\r') {
+
+        rf.attach(NULL, Serial::RxIrq);
+        fnode.rfBufferCounter = 0;
+        fnode.rfInterruptComplete = true;
+    }
+}
+
+void master_rx_isr()
+{
+    fnode.masterBufferChar = master.getc();
+
+    if (fnode.masterBufferChar != '\r') {
+
+        fnode.masterRxBuffer[fnode.masterBufferCounter] = fnode.masterBufferChar;
+        fnode.masterBufferCounter++;
+
+    } else if (fnode.masterBufferChar == '\r') {
+
+        master.attach(NULL, Serial::RxIrq);
+        fnode.masterBufferCounter = 0;
+        fnode.masterInterruptComplete = true;
+    }
+}
+
+// Sayaç pals ISR
+void watermeter_isr()
+{
+    fnode.pulse ++;
+    fnode.pulseTransmit ++;
+    fnode.pulsePressureCheck ++;
+}
+
+// Yıkama fazı değişim ISR
+void flush_phase_isr()
+{
+    fnode.flush_isr = true;
+}
+
+// Basınç kontrol ISR
+void pressure_check_isr()
+{
+    fnode.checkPressure = true;
+}
+
+void periodic_flush_isr()
+{
+    fnode.periodicFlushCounter ++;
+}
+
+void min_flush_interval_isr()
+{
+    fnode.minFlushCounter ++;
+}
+
+void rt_data_transmit_isr()
+{
+    fnode.transmit_rtData = true;
+    fnode.rtCounter ++;
+}
+#endif
\ No newline at end of file