Kvalita vody pomocou TDS A PH senzoru - NÁVOD

www
Odpovědět
Uživatelský avatar
tiimsvk
Dárce - Donátor
Dárce - Donátor
Příspěvky: 801
Registrován: 06. květen 2021, 07:03
Dal poděkování: 72 poděkování
Dostal poděkování: 65 poděkování

Kvalita vody pomocou TDS A PH senzoru - NÁVOD

Příspěvek od tiimsvk »

Ahojte bratovi vyrabam narodeninovy darček nakoľko je akvarista tak pomocou esp mu vyrabam meranie kvality vody.
ČO DOKÁŽE:
TDS je údaj o celkovom množstve rozpustených látok vo vode (minerály, soli, kovy…). S výpisom kvality a upozornením na veľmi špinavu vodu
PH vody (doplnim)
Teplotu vody (s upozornením na nizku a vysokú teplotu
Teplotu a vlhkosť okolia
Lux meter na ovladanie podsvietenia displeja
Tlačidla ovladanie relay druhe bez zadania
Displej s jednotlivými hodnotami
Bateria (indikacia nabijania plneho nabitia vybitia a poškodenie alebo chybajuca bateria)
Relay zatial s nedefinovaným nastavením
Kvalita wifi signalu na displeji

Nakoľko je to ako darček a brat nema HA tak je to bez integracie hodin atď všetko bude fungovať na online mode s webovým rozhraním.

ČO POTREBUJEME:
Základ:
- esp 32 (ja som použil konkretne lolin32 lite s integrovanym obvodom na pripojenie baterie),
- tds senzor (TDS meter v1.0 3.3v)
- dallas teplotny senzor vodovzdorny, (DS18B20)
- ph senzor (PH electrode sensor)
- ads1115 (budem testovať pretože ph senzor používa 5v vstup)

Doplnkové:
- DHT22 modul
- OLED display 128x64 1.3" i2c
- relay 3.3v 230ac 10A
- ldr photodioda
- 18650 bateria
- 2x button
- 1x vypinac mini

- Spotrebne:
- 2x 10k resistor pre i2c zosilnenie
- 2x 1k resistor pre tlačidlá
- 1x 10k resistor pre ldr photodiodu
- 4.7k pre DS18B20 senzor
- 680k a 330k resistory a 0.1uf kondenzator pre citanie adc stavu baterie
- 1M a 1k resistory pre citanie stavu nabijania na ld4085
- prototypovacie dosky
- gpio konektory.
- lan konektor s 2x led + 22ohm odpory pre led
- farebna kabelaz awg28

PRIPOJENIE:
Väčšinu senzorov som odkukal z internetu. Tak ak máte problem so zapojením podľa môjho návodu stači zadať do gooogle :).
TDS modul:
Je jednoduchy nakoľko kablovy senzor ide priamo do modulu a z moduku idu 3piny 3.3VDC, GND a analog, ktory priamo pripojime do adc pinu na esp32.

Dallas DS18B20:
Taktiež 3 piny 3.3VDC, GND, a analog pripojiť s 4.7k do VDC a Do gpio pinu nemusi byt adc.

PH:
Doplnim ked mi pride.

Adc citanie stavu baterie pomocou divideru.

Relay 3vdc, gnd, a digitalny pin

Display Pomocou i2c 3.3vdc, gnd a gpio22 a 23 s prepojenim pomocou 10k resistorom do VDC

DHT:
3.3VDC, GND A digital pin

LDR:
3.3Vdc do ldr z ldr do adc a z adc cez 4.7k do GND

Samozrejme tlacidla, bateriu vypinace a dalšie veci nejdem rozpisovať.

FOTO:
20220918_163418.jpg
20220918_163414.jpg
20220923_074818.jpg
20220923_074809.jpg
20220923_074805.jpg
YAML KOD:

Kód: Vybrat vše

substitutions:
  friendly_name: ESP-Aquarium
  device_name: esp-aquarium
  created_by: "StudioTiiM 2022"
  device_description: "measuring the quality of water in the aquarium. A birthday present"

#-------------------------------------------
# Define pins
#-------------------------------------------
  battery_state_pin: GPIO13 #connected to lp4054 CHARG PIN
  usb_state_pin: GPIO15 # usb connected
  led_yellow_pin: GPIO16
  led_green_pin: GPIO17

  button1_pin: GPIO18 #yellow
  button2_pin: GPIO19 #orange
  
  dht_pin: GPIO27 #DHT22 AM2302 Temp and humidity
  dallas_pin: GPIO26 #DS18B20 temp
  relay_pin: GPIO25 #Relay 3VDC 230V 10A

  battery_pin: GPIO39 #VN
  tds_pin: GPIO33
  ph_pin: GPIO34
  ldr_pin: GPIO35
#-------------------------------------------
# ESP main settings
#-------------------------------------------
esphome:
  name: esp-aquarium

esp32:
  board: lolin_d32
  framework:
    type: arduino

logger:
api:
ota:
  password: !secret ota_pass

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "$device_name Hotspot"
    password: "passaquarium"

web_server:
  port: 80

captive_portal:

#-------------------------------------------
# DEFINE PIN I2C AND DALLAS TEMPERATURE SENSOR
#-------------------------------------------
i2c:
    sda: 22 #purple
    scl: 23 #blue
    
dallas:
  - pin: "$dallas_pin"
    update_interval: 15s
    
#-------------------------------------------
# STATUS LED
# Yellow led on lan socket
#-------------------------------------------
status_led:
  pin:
    number: "$led_yellow_pin"
    inverted: true

#-------------------------------------------
# SENSORS
#-------------------------------------------
sensor:
#-------------------------------------------
# Duty cycle - battery state charging
# connected to lp4054 modul CHARGE PIN
# battery charging pin is low, full charge pin is high, no battery high impedance on pin
# connected to mcu whit two resistors 1M to VCC and 1k to GPIO
#-------------------------------------------
  - platform: duty_cycle
    pin: "$battery_state_pin"
#    name: "${friendly_name} Battery2 duty"
    id: battery_state
    update_interval: 2s
    on_value:
      if:
        condition:
          binary_sensor.is_on: usb_state
        then:
          - if:
              condition:
                sensor.in_range:
                  id: battery_state
                  below: 10
              then:
                - lambda: id(power_state).publish_state("Charge");
          - if:
              condition:
                sensor.in_range:
                  id: battery_state
                  above: 99.9
              then:
                - lambda: id(power_state).publish_state("Full Charge");
          - if:
              condition:
                sensor.in_range:
                  id: battery_state
                  above: 99.0
                  below: 99.9
              then:
                - lambda: id(power_state).publish_state("No Battery");
        else:
          - if:
              condition:
                binary_sensor.is_off: usb_state
              then:
                - lambda: id(power_state).publish_state("On Battery");

#-------------------------------------------
# Battery sensor - ADC whit divider units % battery 18650 3.7V, 
# divider resistor 330k and 680k whit 0.1uF
# 4.3V battery max voltage out
#-------------------------------------------
  - platform: adc
    pin: "$battery_pin"
    name: "${friendly_name} Battery"
    attenuation: 11db    
    accuracy_decimals: 0
    unit_of_measurement: "%"
    update_interval: 1s
    filters:
      - median:
          window_size: 7
          send_every: 4
          send_first_at: 3
      - calibrate_linear:
          - 1.85 -> 0    #2.7 min voltage
          - 2.75 -> 100  #4.15 max voltage
#      - filter_out: 0.0
      # No value lower than 0
      - lambda: 'return max((float)0.0, x);'
      # No value greater than 100
      - lambda: 'return min((float)100.0, x);'
    icon: mdi:battery
    id: batlevel
    device_class: battery
    entity_category: diagnostic

#-------------------------------------------
# Wifi signal component
#-------------------------------------------
  - platform: wifi_signal
    name: "${friendly_name} Signal"
    id: "signal"
    update_interval: 360s

#-------------------------------------------
# TDS modul - TDS Meter V1.0

# 1 ppm TDS = 1,56 µS/cm = 0,156 mS/m = 0,00156 mS/cm
# 1 µS/cm = 0,1 mS/m = 0,001 mS/cm = 0,64 ppm TDS

# Agentúra EPA nastavila určité kvalitatívne ukazovatele kvality vody:
# DESTILOVANÁ < 50
# ČISTÁ 50 – 150 ppm – je ideálna čistá voda. Takúto vodu dokážu upraviť domáce osmotické filtre, plus doupraviť uhlíkové filtre.
# PITNÁ 150 – 200 ppm – je považovaná za akceptovateľnú vodu na pitie.
# MINERALIZOVANA200 – 490 ppm –  je vysoko mineralizovaná voda.
# ŠPINAVÁ viac ako  500 ppm –  je voda maximálne koncentrovaná minerálmi a rozpustenými látkami vo vode.

# max in aquarium 600ppm
#-------------------------------------------
  # Raw voltage on pin
  - platform: adc
    pin: "$tds_pin"
    name: "Aquarium tds raw voltage"
    id: tds_raw_v
    attenuation: 6db
    update_interval: 500ms
    unit_of_measurement: "V"
    icon: "mdi:water-percent"
    filters:
       - median:
          window_size: 8
          send_every: 5
          send_first_at: 4
    internal: true

  # Temperature Compensated Voltage
  - platform: template
    name: "TDS 01 TCV"
    id: temp01_comp_v
    unit_of_measurement: 'v'
    accuracy_decimals: 3
    lambda: 'return ((id(tds_raw_v).state) / (1 + (0.02 * ((id(temp_water).state) - 25.0))));'
    update_interval: 5s
    internal: true

  # Temperature Compensated TDS
  - platform: template
    name: "${friendly_name} Aquarium Water Quality"
    id: water_quality_tds
    icon: "hass:water-opacity"
    unit_of_measurement: 'PPM'
    accuracy_decimals: 0    
    lambda: return (133.42*(id(temp01_comp_v).state)*(id(temp01_comp_v).state)*(id(temp01_comp_v).state) - 255.86*(id(temp01_comp_v).state)*(id(temp01_comp_v).state) + 857.39*(id(temp01_comp_v).state))*0.5;
    update_interval: 5s
    
#-------------------------------------------
# DALLAS temeprature sensor DS18B20
#-------------------------------------------
  - platform: dallas
    address: 0xde3cc1f64821fd28
    name: "${friendly_name} Aquarium Temperature"
    id: temp_water
    unit_of_measurement: "°C"

#-------------------------------------------
# LDR SENSOR - LIGHT lux whit ldr 4.7k
# full scale 11db
# calibrate whit mobile app lux
#-------------------------------------------
  - platform: adc
    id: ldr_adc
    attenuation: 11db
    pin: "$ldr_pin"
    name: "${friendly_name} Illuminance"
    unit_of_measurement: lux
    device_class: illuminance
    accuracy_decimals: 0
    update_interval: 1.0s
    filters:
      - median:
          window_size: 5
          send_every: 4
          send_first_at: 3
      - calibrate_polynomial:
         degree: 5
         datapoints:
        # Map 0.0 (from sensor) to 0.0 (true value)
          - 0.0 -> 0.0
          - 0.2 -> 0.0
          - 0.5 -> 5
          - 0.75 -> 12
          - 1.0 -> 50
          - 1.5 -> 75
          - 1.75 -> 120
          - 2.0 -> 200
          - 2.25 -> 350
          - 2.5 -> 750
          - 2.75 -> 1500         
          - 2.9 -> 2000
          - 3.0 -> 2600
          - 3.14 -> 3600    
      # No value lower than 0
      - lambda: 'return max((float)0.0, x);' 
    on_value:
      then:
        - if:
            condition:
              lambda: "return id(ldr_adc).state > 10;"
            then:
              - light.turn_on: displaylight
            else:
              - light.turn_off: displaylight
      
#-------------------------------------------
# PH sensor module
#-------------------------------------------

#-------------------------------------------
# DHT22 - Temperature and Humidity
#-------------------------------------------
  - platform: dht
    model: AM2302
    pin: "$dht_pin"
    temperature:
      name: "${friendly_name} Temperature"
      id: temp
    humidity:
      name: "${friendly_name} Humidity"
      id: humidity
#    update_interval: 15s

#-------------------------------------------
# BINARY SENSORS
#-------------------------------------------        
binary_sensor:
#-------------------------------------------
# USB state - solder onboard charger state led in vcc
# when active usb ON
#-------------------------------------------
  - platform: gpio
#    name: "${friendly_name} Battery state"
    id: usb_state
    pin: "$usb_state_pin"
    on_state:
      then:
        component.update: battery_state
    
#-------------------------------------------
# Button Up
# relay
#-------------------------------------------
  - platform: gpio
    name: "${friendly_name} Button 1"
    pin:
      number: "$button1_pin"
    id: button_up
    filters:
      - invert:
      - delayed_on: 10ms
    on_press:
      then:
        - switch.template.publish:
            id: button_relay
            state: !lambda |-
              if (id(button_relay).state) {
                return false;
              } else {
                return true;
              }

#-------------------------------------------
# Button Down
#-------------------------------------------
  - platform: gpio
    name: "${friendly_name} Button 2"
    pin:
      number: "$button2_pin"
    id: button_down
    filters:
      - invert:
      - delayed_on: 10ms

#-------------------------------------------
# TEXT SENSORS
#-------------------------------------------
text_sensor:
#-------------------------------------------
# Charger text sensor
#-------------------------------------------
  - platform: template
    name: "${friendly_name} Power status"
    icon: mdi:power-plug
    id: power_state
    lambda: |-
       return {"Loading"};
    update_interval: never

#-------------------------------------------
# SWITCHES
#-------------------------------------------
switch:
#-------------------------------------------
# Template Switch
#-------------------------------------------
  - platform: template
    name: "${friendly_name} Relay"
    id: button_relay
    optimistic: true
    restore_state: on
    on_turn_on:
      then:
        - switch.turn_on:
            id: relay
        - light.turn_on:
            id: green_led_switch
    on_turn_off:
      then:
        - switch.turn_off:
            id: relay
        - light.turn_off:
            id: green_led_switch

#-------------------------------------------
# Switch - relay JQC3F 03VDC-C 250AVC 10A whit optoculer - LOW TRIGGER
#-------------------------------------------
  - platform: gpio
    name: "${friendly_name} Relay"
    pin:
      number: "$relay_pin"
      inverted: true
    id: relay

#-------------------------------------------
# LIGHTS
#-------------------------------------------
light:
#-------------------------------------------
# OLED brightness control
#-------------------------------------------
  - platform: monochromatic
    name: "${friendly_name} Brightness"
    output: oled_bc
    id: displaylight
    icon: "mdi:monitor"

#-------------------------------------------
# Led green control - charge battery state
#-------------------------------------------
  - platform: binary
    name: "${friendly_name} Charge Green Led"
    output: led_green
    id: green_led_switch

#-------------------------------------------
# OUTPUTS - OLED brightness control
#-------------------------------------------
output:
#-------------------------------------------
# OLED brightness control
#-------------------------------------------
  - platform: template
    id: oled_bc
    type: float
    write_action:
      then:
        - lambda: id(oled).set_contrast(state);
    min_power: 0.2
    max_power: 1.0
    
#-------------------------------------------
# Led green control - charge battery state
# green led on lan socket
#-------------------------------------------
  - platform: gpio
    id: led_green
    pin: "$led_green_pin"

#-------------------------------------------
# DISPLAY
#-------------------------------------------
display:
  - platform: ssd1306_i2c
    model: "SH1106 128x64"
    id: oled
    reset_pin: 18
    address: 0x3C
#    invert: true
#    rotation: 180°

    lambda: |-
      //--------------------------------------------------------------------------
      // START PAGE
      //--------------------------------------------------------------------------
      
      //--------------------------------------------------------------------------
      // TITLE TOP
      //--------------------------------------------------------------------------
      it.print(0, 0, id(font3), TextAlign::TOP_LEFT, "KVALITA VODY");
      
      //--------------------------------------------------------------------------
      // WIFI SIGNAL SENSOR - mdi print
      //--------------------------------------------------------------------------
      if (id(usb_state).state) {
        float duty_battery = (id(battery_state).state);  //convert state to float
        if (duty_battery < 10) {
          static int a = 0;
          a++;
          if ((a % 2) == 0) {
            //power plug icon
            it.printf(it.get_width() - 4, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F06A5");          
          }
          else {
            //empty space
            it.printf(it.get_width() - 4, 1, id(font2), TextAlign::TOP_RIGHT, " ");
          }
        }
        else {
          //power plug icon
          it.printf(it.get_width() - 4, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F06A5");
        }
        
        int signal_wifi = int(id(signal).state);   //convert state to int
      
        if (signal_wifi < 0 && signal_wifi >= -50) {
          it.printf(it.get_width() - 14, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BE");
        }
        if (signal_wifi < -50 && signal_wifi >= -70) {
          it.printf(it.get_width() - 14, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BD");
        }
        if (signal_wifi < -70 && signal_wifi >= -100) {
          it.printf(it.get_width() - 14, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BC");
        }
        else {
          it.printf(it.get_width() -14, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BF");
        }
      }
      else {
        int signal_wifi = int(id(signal).state);   //convert state to int
      
        if (signal_wifi < 0 && signal_wifi >= -50) {
          it.printf(it.get_width() - 7, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BE");
        }
        if (signal_wifi < -50 && signal_wifi >= -70) {
          it.printf(it.get_width() - 7, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BD");
        }
        if (signal_wifi < -70 && signal_wifi >= -100) {
          it.printf(it.get_width() - 7, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BC");
        }
        else {
          it.printf(it.get_width() -7, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F08BF");
        }
      }

      //--------------------------------------------------------------------------
      // BATTERY SENSOR - mdi print
      //--------------------------------------------------------------------------
      float duty_battery = (id(battery_state).state);  //convert state to float
      if (duty_battery > 99 && duty_battery < 99.8) {
        it.printf(it.get_width() + 4, 0, id(fonticon), TextAlign::TOP_RIGHT, "\U000F0083");
      }
      else {
        float bat_level = (id(batlevel).state);  //convert batlevel state to float
      
        //>100%
        if (bat_level >= 95) {
          it.printf(it.get_width() + 4, 0, id(fonticon), TextAlign::TOP_RIGHT, "\U000F0079");
        }
        //>75%
        else if (bat_level < 95 && bat_level >= 75) {
          it.printf(it.get_width() + 3, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F0081");
        }
        //>50%
        else if (bat_level < 75 && bat_level >= 50) {
          it.printf(it.get_width() + 3, 0, id(fonticon), TextAlign::TOP_RIGHT, "\U000F007F");
        }
        //>25%
        else if (bat_level < 50 && bat_level >= 25) {
          it.printf(it.get_width() + 3, 0, id(fonticon), TextAlign::TOP_RIGHT, "\U000F007B");
        }
        //>0%
        else if (bat_level < 25) {
          static int i = 0;
          i++;
          if ((i % 2) == 0)
            it.printf(it.get_width() + 4, 0, id(font2), TextAlign::TOP_RIGHT, " ");
          else
            it.printf(it.get_width() + 3, 1, id(fonticon), TextAlign::TOP_RIGHT, "\U000F008e");
        }
        else {
          it.printf(it.get_width() + 4, 0, id(fonticon), TextAlign::TOP_RIGHT, "\U000F0083");
        }
      }
      //--------------------------------------------------------------------------
      // LINE
      //--------------------------------------------------------------------------
      it.line(0, 14, 128, 14);
      
      //--------------------------------------------------------------------------
      // DALLAS TEMPERATURE
      //--------------------------------------------------------------------------
      float water_temp = (id(temp_water).state);  //convert state to float
      //<22
      if (water_temp <= 22) {
        static int z = 0;
        z++;
        if ((z % 2) == 0) {
          it.printf(0, 64, id(font1), TextAlign::BASELINE_LEFT, "%.1f", id(temp_water).state);
          it.printf(52, 64, id(font2), TextAlign::BASELINE_LEFT, "°C");
        }
        else {
          it.printf(0, 40, id(font2), TextAlign::BASELINE_LEFT, "LOW");
          it.printf(0, 64, id(font2), TextAlign::BASELINE_LEFT, "TEMP");
          it.printf(52, 64, id(font2), TextAlign::BASELINE_LEFT, "°C");
        }
      }
      //22-28
      else if (water_temp > 22 && water_temp < 28) {
        it.printf(0, 64, id(font1), TextAlign::BASELINE_LEFT, "%.0f", id(temp_water).state);
        it.printf(52, 64, id(font2), TextAlign::BASELINE_LEFT, "°C");
      }
      //>=28
      else if (water_temp >= 28) {
        static int q = 0;
        q++;
        if ((q % 2) == 0) {
          it.printf(0, 64, id(font1), TextAlign::BASELINE_LEFT, "%.1f", id(temp_water).state);
          it.printf(52, 64, id(font2), TextAlign::BASELINE_LEFT, "°C");
        }
        else {
          it.printf(0, 64, id(font1), TextAlign::BASELINE_LEFT, "HIGH");
          it.printf(52, 64, id(font2), TextAlign::BASELINE_LEFT, "°C");
        }
      }
      //nan
      else {
        it.printf(0, 40, id(font2), TextAlign::BASELINE_LEFT, "LOAD");
        it.printf(0, 64, id(font2), TextAlign::BASELINE_LEFT, "TEMP");
      }

      //--------------------------------------------------------------------------
      // TDS
      //--------------------------------------------------------------------------
      if (isnan(id(water_quality_tds).state)) {
        it.printf(128, 15, id(font2), TextAlign::TOP_RIGHT, "LOAD TDS");
      }
      else {
        it.printf(110, 15, id(font2), TextAlign::TOP_RIGHT, "%.0f", id(water_quality_tds).state);
        it.printf(128, 15, id(font4), TextAlign::TOP_RIGHT, "ppm");
      }
      
      float water_quality = (id(water_quality_tds).state);  //convert state to float
      //<50
      if (water_quality <= 50) {
        it.printf(128, 39, id(font3), TextAlign::TOP_RIGHT, "DESTIL");
      }
      //50-150
      else if (water_quality > 50 && water_quality <= 150) {
        it.printf(128, 39, id(font3), TextAlign::TOP_RIGHT, "CISTA");
      }
      //150-200
      else if (water_quality > 150 && water_quality <= 200) {
        it.printf(128, 39, id(font3), TextAlign::TOP_RIGHT, "PITNA");
      }
      //200-490
      else if (water_quality > 200 && water_quality <= 490) {
        it.printf(128, 39, id(font3), TextAlign::TOP_RIGHT, "MINERAL");
      }
      //>490
      else if (water_quality > 490) {
        static int y = 0;
        y++;
        if ((y % 2) == 0)
          it.printf(128, 39, id(font3), TextAlign::TOP_RIGHT, "SPINAVA");
        else
          it.printf(128, 39, id(font3), TextAlign::TOP_RIGHT, "VYCISTIT");
      }
      else {
        
      }
      //--------------------------------------------------------------------------
      // DHT22
      //--------------------------------------------------------------------------
      if (id(temp).has_state()) {
        it.printf(128, 64, id(font3), TextAlign::BASELINE_RIGHT , "%.1fŘ %.0f%%", id(temp).state, id(humidity).state);
      }
      
      //--------------------------------------------------------------------------
      // END PAGE
      //--------------------------------------------------------------------------

#-------------------------------------------
# FONT
#-------------------------------------------
font:
  - file: 'materialdesignicons-webfont.ttf'
    id: fonticon
    size: 14
    glyphs: [
      "\U000F08BF", # no wifi
      "\U000F08BC", # wifi low
      "\U000F08BD", # mwifi middle
      "\U000F08BE", # wifi high
      "\U000F0079", # full
      "\U000F0081", # 75
      "\U000F007F", # 50
      "\U000F007B", # 25
      "\U000F0083", # alert
      "\U000F008e", # empty
      "\U000F0241", # flash
      "\U000F0904", # sleep
      "\U000F06A5", # power plug
      ]
      
  - file: 'fonts/steelfish_bd.ttf'
    id: font1
    size: 48
    
  - file: 'fonts/steelfish_bd.ttf'
    id: font2
    size: 22

  - file: 'fonts/pixeloperator.ttf'
    id: font3
    size: 14
    glyphs:
      ['&', '@', '!', ',', '.', '"', '%', '(', ')', '+', '-', '_', ':', '°', '0',
       '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
       'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
       'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
       'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
       'u', 'v', 'w', 'x', 'y', 'z','å', 'ä', 'ö', '/','º','µ','³', 'Ř']
       
  - file: 'fonts/studiotiim.ttf'
    id: font4
    size: 14
PLÁNOVANÉ:
- Doplniť PH senzor ked pride poštou
- krabičku spodnú zabaliť do čiernej mnatnej fólie
- kalibrovať priamo v akvariu
- doplniť ovladanie relay na konkretny prvok v akvariu (ohrievač, osvetlenie atď)

sachlj
Aktivní autor
Aktivní autor
Příspěvky: 60
Registrován: 26. březen 2023, 17:37
Dal poděkování: 9 poděkování
Dostal poděkování: 1 poděkování

Re: Kvalita vody pomocou TDS A PH senzoru - NÁVOD

Příspěvek od sachlj »

Nechci tě odrazovat od PH měření. Měl jsem roky PH metr pro řízení doplňování CO2 do akvária. Problém je že ty levné sondy (tj. do 10000,- kč) se musí furt, furt kalibrovat. je vhodnější a to mi věř- malé čerpadlo, to natáhne vodu z akvária do zkumavky, nakape se roztok, se zkumavkou se zatřepe, počká se X sekund a pak se na zkumavku zasvítí (žárovkou NE led) a senzorem na barvu pro arduino se změří barva. a podle barevné škály se spočítá pH. Zkumavka se pak vylije a propláchne destilovanou vodou. Protože jinak bude každý týden vytahovat sondu z akvária, omývat destilkou a pak kalibrovat roztoky (co taky nejsou zrovna levné) a tak dokola. Jo a ty levné sondy kolem 1000 kč vydrží tak rok maximálně.

Odpovědět

Zpět na „ESPHome“