ProtoBoksi DIY-ohje

DIY aurinkokääntäjän ohjausboksi

Tässä ohjeessa rakennetaan aurinkopaneelin kääntäjälle ohjausboksi, jossa D1 Mini lukee AS5600-kulma-anturia, ohjaa moottoria releillä/transistoreilla ja näkyy Home Assistantissa ESPHomen kautta.

Mitä tämä tekee?

Tämä projekti on aurinkopaneelien kääntäjän ohjausboksi. Mekaniikka ja moottori liikuttavat paneeleita, mutta tämä boksi tuo mukaan asentotiedon, moottorin ohjauksen, rajat ja Home Assistant -näkymän.

1. Lukee asennonAS5600-magneettianturi kertoo ESPille paneelin kulman asteina.
2. Ohjaa moottoriaD1 Mini ohjaa releitä transistorien kautta: yksi suunta aamuun, toinen iltaan.
3. Toimii paikallisestiPeruslogiikka on ESPissä, joten Home Assistant ei joudu vahtimaan jokaista sekuntia.
Peruslogiikka: aamulla paneeli on aamuasennossa, päivän aikana tavoite liikkuu hiljalleen ilta-asentoon, ja puolen yön aikaan paneeli palautetaan takaisin aamuasentoon.

Komponentit

Tämä lista on ohjausboksia varten. Paneelien teline, moottori ja mekaniikka voivat olla jokaisella erilaiset.

OsaMihin sitä käytetään?Huomio
Wemos D1 Mini / ESP8266Ohjaimen “aivot”, ESPHome ja WiFiD1/D2 I2C:lle, D5/D6 moottoriohjaukseen
AS5600Magneettinen kulma-anturiAnturin päälle akselin päähän pieni magneetti
NPN-transistoritReleiden / K1-K2-ohjausten vetäminen maihinEsim. BC337, 2N2222, S8050
1 kΩ vastuksetGPIO → transistorin baseYksi per ohjaussuunta
10 kΩ vastuksetBase → GND alasvetoEstää transistorin kellumisen
Releet / suunnanvaihtokytkentäMoottorin suunnan ohjausKaksi suuntaa: aamu / ilta
1N4007-diodiReleen kelan flyback-suojaRaidallinen pää relekelan + puolelle
LM2596 / stepdownLaskee 12/24 V → 5 V ESPilleSäädä 5 V ennen kuin kytket D1 Minin
RajakytkimetMekaaniset ääriasentojen turvatEstää rakenteen ajamisen rikki
3D-tulostettu koteloElektroniikan suojaus ja kiinnitysMuista vedonpoistot ja tiivistys ulkokäyttöön
Vastuuhuomio: tämä on DIY-projekti, ei valmis kaupallinen tuote. Moottori, akku, virtalähde ja ulkoasennus pitää mitoittaa järkevästi ja turvallisesti.

Kytkennät

D1 Mini → AS5600

AS5600 käyttää I2C-väylää. D1 Minillä tässä käytetään D1 ja D2 pinnejä.

D1 / GPIO5AS5600 SCL
D2 / GPIO4AS5600 SDA
GNDAS5600 GND
3V3AS5600 VCC

D1 Mini → transistorit → releohjaus

GPIO ohjaa NPN-transistoria, joka vetää releen tai ohjaustulon maihin. Sama kytkentä tehdään kahdesti: yksi aamu-suuntaan ja yksi ilta-suuntaan.

D51 kΩ → NPN base → K1/aamu-suunta
D61 kΩ → NPN base → K2/ilta-suunta
NPN emitterGND
NPN collectorreleen ohjaus / K1 tai K2
Muistisääntö: NPN sopii tähän, koska halutaan vetää ohjaustulo maihin. ESP GPIO HIGH → transistori johtaa → rele/ohjaus aktivoituu.

Virtapuoli

12/24 V akku tai virtalähde
  ├─ sulake
  ├─ moottori / releiden tehopuoli
  └─ LM stepdown → 5 V → D1 Mini

GND pitää olla yhteinen:
akku/virtalähde GND → ohjaus GND → D1 Mini GND

DIY-releohjaus transistorilla

Videolla alkuperäinen valmis relekortti hajosi koteloon asentaessa, joten moottorin ohjaus tehtiin lopulta itse releillä, NPN-transistoreilla ja vastuksilla. Tämä osio dokumentoi sen perusidean, jotta sama kytkentä löytyy myös ohjesivulta eikä pelkästään videolta.

Idea lyhyesti: D1 Mini ei aja relettä tai moottoria suoraan. GPIO antaa pienen ohjaussignaalin transistorin baseen. Transistori vetää releen kelan miinuspuolen maihin, jolloin rele vetää.

Yhden releen kytkentä

Tee tämä kytkentä yhdelle suunnalle. Jos tarvitset moottorille eteen/taakse-ohjauksen, tee sama kytkentä kahdesti: toinen D5-pinnille ja toinen D6-pinnille.

D1 Mini D5 tai D6 1 kΩ vastus → NPN base
NPN emitter GND
NPN collector releen kelan miinuspuoli
+12 V releen kelan pluspuoli
10 kΩ alasveto base → GND
1N4007-diodi releen kelan rinnalle, raidallinen pää +12 V puolelle

ASCII-kaavio

D1 Mini GPIO
   │
   ├── 1 kΩ ── B   NPN-transistori
   │          C ───────── releen kelan miinus
   │          E ───────── GND
   │
   └── 10 kΩ ───── GND


+12 V ───────────── releen kelan plus

Diodi 1N4007 relekelan yli:
raidallinen pää +12 V puolelle
toinen pää transistorin collector / kelan miinuspuolelle

Kahden suunnan ohjaus

Aurinkokääntäjässä moottorille tarvitaan kaksi suuntaa. Käytännössä sama rele-/transistorikytkentä tehdään kahdesti.

ESP-pinni Kytkentä Käyttö
D5 1 kΩ → NPN base, collector → rele 1 Kulma isommaksi / aamuun päin
D6 1 kΩ → NPN base, collector → rele 2 Kulma pienemmäksi / iltaan päin
Hyvä muistisääntö: tässä käytetään NPN-transistoria, koska halutaan vetää releen tai ohjaustulon miinuspuoli maihin. GPIO HIGH → transistori johtaa → rele vetää.
Älä jätä diodia pois lopullisesta versiosta. Releen kela voi tehdä sammutushetkellä jännitepiikin, joka buuttaa ESPin tai rikkoo transistorin. 1N4007 kelan rinnalla on halpa vakuutus.

Releen koskettimet

Releen kelapuoli ja kosketinpuoli ovat eri asioita. Transistori ohjaa releen kelaa. Releen koskettimilla ohjataan moottorin virtapuolta tai suunnanvaihtoa.

COM yhteinen kosketin
NO normally open, yhdistyy kun rele vetää
NC normally closed, yhdistetty kun rele ei vedä

Jos käytät moottorin suunnanvaihtoon kahta relettä, varmista koodissa ja johdotuksessa, etteivät molemmat suunnat voi olla yhtä aikaa päällä. ESPHome-koodissa tämä tehdään interlock-asetuksella.

ESPHome-koodi

Alla oleva koodi on toimiva pohja D1 Minille. Siinä on AS5600, manuaalinapit, automaattiseuranta, softarajat, puolen yön palautus aamuasentoon ja STOP.

Säädä omat rajat: muuta kulma_min, kulma_max, aamu_kulma ja ilta_kulma omien mitattujen ääriasentojen mukaan.
esphome:
  name: aurinkokaantaja-as5600
  friendly_name: Aurinkokääntäjä AS5600
  on_boot:
    priority: 800
    then:
      - script.execute: aurinkokaantaja_stop

esp8266:
  board: d1_mini

logger:

api:
  encryption:
    key: !secret api_encryption_key

ota:
  platform: esphome
  password: !secret ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  ap:
    ssid: "aurinkokaantaja_fallback_ssid"
    password: !secret fallback_password

captive_portal:

time:
  - platform: sntp
    id: esp_aika
    timezone: Europe/Helsinki
    on_time:
      - seconds: 0
        minutes: 0
        hours: 0
        then:
          - script.execute: palauta_aamuun

i2c:
  sda: D2
  scl: D1
  scan: true
  frequency: 100kHz

as5600:
  id: paneelin_as5600
  direction: clockwise

globals:
  - id: kulma_min
    type: float
    restore_value: true
    initial_value: "145.0"

  - id: kulma_max
    type: float
    restore_value: true
    initial_value: "218.0"

  - id: aamu_kulma
    type: float
    restore_value: true
    initial_value: "218.0"

  - id: ilta_kulma
    type: float
    restore_value: true
    initial_value: "145.0"

  - id: kuollut_alue
    type: float
    restore_value: true
    initial_value: "2.0"

  - id: seuranta_alku_tunti
    type: int
    restore_value: true
    initial_value: "6"

  - id: seuranta_loppu_tunti
    type: int
    restore_value: true
    initial_value: "22"

sensor:
  - platform: as5600
    as5600_id: paneelin_as5600
    name: "Aurinkokääntäjä kulma"
    id: aurinkokaantaja_kulma
    unit_of_measurement: "°"
    accuracy_decimals: 1
    icon: mdi:rotate-3d-variant
    update_interval: 500ms
    filters:
      - lambda: |-
          return x * as5600::RAW_TO_DEGREES * id(paneelin_as5600).get_range_scale();

    raw_position:
      name: "Aurinkokääntäjä raw position"
      id: aurinkokaantaja_raw

    gain:
      name: "Aurinkokääntäjä AS5600 gain"

    magnitude:
      name: "Aurinkokääntäjä AS5600 magnitude"

    status:
      name: "Aurinkokääntäjä AS5600 status"

  - platform: wifi_signal
    name: "Aurinkokääntäjä WiFi signaali"
    update_interval: 30s

  - platform: template
    name: "Aurinkokääntäjä tavoitekulma"
    id: aurinkokaantaja_tavoitekulma
    unit_of_measurement: "°"
    accuracy_decimals: 1
    update_interval: 30s
    lambda: |-
      auto now = id(esp_aika).now();
      if (!now.is_valid()) return {};
      int minuutit = now.hour * 60 + now.minute;
      int alku = id(seuranta_alku_tunti) * 60;
      int loppu = id(seuranta_loppu_tunti) * 60;
      if (minuutit < alku) return id(aamu_kulma);
      if (minuutit >= loppu) return id(ilta_kulma);
      float etenema = float(minuutit - alku) / float(loppu - alku);
      float tavoite = id(aamu_kulma) + (id(ilta_kulma) - id(aamu_kulma)) * etenema;
      if (tavoite < id(kulma_min)) tavoite = id(kulma_min);
      if (tavoite > id(kulma_max)) tavoite = id(kulma_max);
      return tavoite;

switch:
  - platform: gpio
    name: "Aurinkokääntäjä K1 rele"
    id: aurinkokaantaja_k1
    pin:
      number: D5
      mode: OUTPUT
      inverted: false
    restore_mode: ALWAYS_OFF
    internal: true
    interlock:
      - aurinkokaantaja_k2
    interlock_wait_time: 1000ms

  - platform: gpio
    name: "Aurinkokääntäjä K2 rele"
    id: aurinkokaantaja_k2
    pin:
      number: D6
      mode: OUTPUT
      inverted: false
    restore_mode: ALWAYS_OFF
    internal: true
    interlock:
      - aurinkokaantaja_k1
    interlock_wait_time: 1000ms

  - platform: template
    name: "Aurinkokääntäjä automaattiseuranta"
    id: automaattiseuranta
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    icon: mdi:solar-power-variant

script:
  - id: aurinkokaantaja_stop
    mode: restart
    then:
      - switch.turn_off: aurinkokaantaja_k1
      - switch.turn_off: aurinkokaantaja_k2

  - id: aja_kulmaa_isommaksi_1s
    mode: restart
    then:
      - switch.turn_off: aurinkokaantaja_k2
      - delay: 1000ms
      - switch.turn_on: aurinkokaantaja_k1
      - delay: 1s
      - switch.turn_off: aurinkokaantaja_k1

  - id: aja_kulmaa_pienemmaksi_1s
    mode: restart
    then:
      - switch.turn_off: aurinkokaantaja_k1
      - delay: 1000ms
      - switch.turn_on: aurinkokaantaja_k2
      - delay: 1s
      - switch.turn_off: aurinkokaantaja_k2

  - id: palauta_aamuun
    mode: restart
    then:
      - switch.turn_off: aurinkokaantaja_k2
      - delay: 1000ms
      - switch.turn_on: aurinkokaantaja_k1
      - wait_until:
          condition:
            lambda: |-
              if (!id(aurinkokaantaja_kulma).has_state()) return true;
              return id(aurinkokaantaja_kulma).state >= (id(aamu_kulma) - id(kuollut_alue));
          timeout: 120s
      - script.execute: aurinkokaantaja_stop

button:
  - platform: template
    name: "Aurinkokääntäjä kulma isommaksi 1s"
    icon: mdi:arrow-right-bold
    on_press:
      - script.execute: aja_kulmaa_isommaksi_1s

  - platform: template
    name: "Aurinkokääntäjä kulma pienemmäksi 1s"
    icon: mdi:arrow-left-bold
    on_press:
      - script.execute: aja_kulmaa_pienemmaksi_1s

  - platform: template
    name: "Aurinkokääntäjä STOP"
    icon: mdi:stop-circle
    on_press:
      - script.execute: aurinkokaantaja_stop

  - platform: template
    name: "Aurinkokääntäjä palauta aamuun nyt"
    icon: mdi:weather-sunset-up
    on_press:
      - script.execute: palauta_aamuun
Tämä on ohjesivun perusversio. Omassa käytössä koodiin voi lisätä 2 s / 5 s napit, automaattisen 30 s seurannan ja “aja tavoitteeseen nyt” -napin.

Testaus ja käyttöönotto

1. Testaa anturi pöydälläESPHome-logista pitäisi näkyä I2C-laite osoitteessa 0x36.
2. Testaa releet ilman moottoriaK1 ja K2 saavat naksua vain erikseen. Molemmat eivät saa olla yhtä aikaa päällä.
3. Testaa suunnat lyhyillä pulseillaJos “kulma isommaksi” pienentää kulmaa, vaihda D5 ja D6 johdot päittäin.
4. Kirjaa ääriasennotMerkitse muistiin itä/aamu, etelä ja länsi/ilta kulma-arvoina.

Hyvä testijärjestys ulkona

1. Virrat päälle
2. Tarkista WiFi ja AS5600-kulma
3. Aja 1 s toiseen suuntaan
4. Aja 1 s toiseen suuntaan
5. Testaa STOP
6. Testaa rajakytkimet käsin
7. Aja varovasti ääriasentoihin
8. Kirjaa kulmat koodiin
9. Testaa aamuun palautus manuaalinapilla

Turvallisuus ja käytännön huomiot

Sulake akun lähelleJos käytät akkua, laita sulake plusjohtoon heti akun lähelle.
Flyback-diodi releelleReleen kela voi tehdä piikin, joka buuttaa ESPin tai rikkoo transistorin.
Moottorille riittävä virtalähdeLäppärin virtalähde voi kyykätä, vaikka moottori vähän pyörisikin.
WiFi ei saa olla ainoa turvaRajakytkimet ja paikallinen ESP-logiikka ovat tärkeitä ulkona.
Älä jätä testiversiota valvomatta. Ennen pidempää käyttöä varmista, että johdot ovat suojattu, kotelo on tiivistetty, moottori pysähtyy rajoihin ja virtapuolella on sulake.

Jatkokehitys

Tämä ohje on ensimmäinen toimiva DIY-versio. Seuraava askel on tehdä paketista siistimpi ja helpommin toistettava.