Inkubatorius paukščiams perėti

Prisireikė inkubatoriaus vištų kiaušiniams perėti.

Dėžė bus klijuojama iš putplasčio, šildymo elementas paprastos kaitrinės lempos, drėgmei palaikyti bandysim naudoti ultragarsinį oro drėkintuvą. Oro cirkuliacijai ir stabiliai oro temperatūrai bei drėgmei palaikyti inkubatoriaus viduje montuojamas kompiuterio 80mm arba 120mm ventiliatorius, kurio greitį bus galima keisti.

Inkubatoriaus smegenims naudojamas Arduino Nano valdiklis. Temperatūros ir drėgmės daviklis DHT11 (jei pasirodys, kad neužtenka tikslumo naudosiu DHT21), SSD1306 ekranėlis (SPI versija modifikuota į I2C versiją, kad liktų daugiau laisvų mikrovaldiklio prievadų), trys mygtukai režimo nustatymui.

Pradinė valdiklio versija surinkta ant maketinės plokštės.

Programos kodas Arduino aplinkoje:

#include <Arduino.h>
#include <string.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <EEPROM.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
#define plus 3
#define minus 4
#define rezimas 5
#define ventiliatorius 6
#define dregme 7
#define temperatura 8
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
DHT dht(DHTPIN, DHTTYPE);
char buffer[10];
byte mode;
boolean keitimai = false, paspausta = false;
float h, t, hs, ts, reikia[3];
unsigned long laikas, laikas, daviklis = 0;

float readFloat(unsigned int addr) {
  union {
    byte b[4];
    float f;
  } data;
  for (int i = 0; i < 4; i++) 
    data.b[i] = EEPROM.read(addr + i);
  return data.f;
}

void writeFloat(unsigned int addr, float x) {
  union {
    byte b[4];
    float f;
  } data;
  data.f = x;
  for (int i = 0; i < 4; i++) 
    EEPROM.write(addr + i, data.b[i]);
}

void setup(void) {
  u8g2.begin();
  dht.begin();
  pinMode(plus, INPUT_PULLUP);
  pinMode(minus, INPUT_PULLUP);
  pinMode(rezimas, INPUT_PULLUP);
  pinMode(plus, INPUT_PULLUP);
  pinMode(minus, INPUT_PULLUP);
  pinMode(rezimas, INPUT_PULLUP);
  pinMode(ventiliatorius, OUTPUT);
  pinMode(dregme, OUTPUT);
  pinMode(temperatura, OUTPUT);
  for (int i = 0; i < 3; i++)
    reikia[i] = readFloat(i * 4);
  if (reikia[0] > 50 || reikia[0] < 10) reikia[0] = 37;
  if (reikia[1] > 99 || reikia[1] < 10) reikia[1] = 75;
  if (reikia[2] > 9 || reikia[2] < 0) reikia[2] = 6;
  h = dht.readHumidity();
  t = dht.readTemperature();
}

void isvedimas() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB10_tr);
  if (isnan(h) || isnan(t)) {
    u8g2.drawStr(0, 20, "Klaida");
    return;
  }
  u8g2.drawStr(0, 12, "Temp Dreg Vent");
  u8g2.setFont(u8g2_font_ncenB14_tr);
  dtostrf(t, 4, 1, buffer);
  u8g2.drawStr(1, 35, buffer);
  dtostrf(h, 4, 1, buffer);
  u8g2.drawStr(52, 35, buffer);
  dtostrf(reikia[2], 2, 0, buffer);
  u8g2.drawStr(105, 35, buffer);
  u8g2.drawLine(45 * mode + 10, 62, 45 * mode + 30, 62);
  u8g2.drawLine(45 * mode + 10, 63, 45 * mode + 30, 63);
  u8g2.setFont(u8g2_font_ncenB12_tr);
  for (int i = 0; i < 2; i++) {
    dtostrf(reikia[i], 4, 1, buffer);
    u8g2.drawStr(48 * i + 4, 55, buffer);
  }
  u8g2.sendBuffer();
  hs = h;
  ts = t;
}

void issaugom() {
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB18_tr);
  u8g2.drawStr(10, 40, "Issaugom");
  u8g2.sendBuffer();
  keitimai = false;
  for (int i = 0; i < 3; i++)
    writeFloat(i * 4, reikia[i]);
  delay(5000);
}

void loop(void) {
  daviklis++;
  if (daviklis > 1000) {
    h = (h * 4 + dht.readHumidity()) / 5;
    t = (t * 4 + dht.readTemperature()) / 5;
    daviklis = 0;
  } 
  if (!digitalRead(rezimas)) {
    mode++;
    paspausta = true;
    if (mode > 2) mode = 0;
    delay(100);
  }
  if (digitalRead(plus) && digitalRead(minus))
    laikas = millis();
  
  if (!digitalRead(plus)) {
    if (mode == 2 || (millis() - laikas) > 3000) {
      if ((millis() - laikas) > 8000)
        reikia[mode] = reikia[mode] + 5;
      else
        reikia[mode]++;
    }
    else
      reikia[mode] = reikia[mode] + .1;
    if (mode > 1) {
      if (reikia[mode] > 9) reikia[mode] = 9;
    }
    else {
      if (reikia[mode] > 99) reikia[mode] = 99;
    }
    paspausta = true;
    keitimai = true;
    laikas2 = millis();
    delay(20);
  }
  if (!digitalRead(minus) && (reikia[mode] != 0)) {
    if (mode == 2 || (millis() - laikas) > 3000) {
      if ((millis() - laikas) > 8000)
        reikia[mode] = reikia[mode] - 5;
      else
        reikia[mode]--;
    }
    else
      reikia[mode] = reikia[mode] - .1;
    if (reikia[mode] < 0) reikia[mode] = 0;
    paspausta = true;
    keitimai = true;
    laikas2 = millis();
    delay(20);
  }
  if (paspausta || ts != t || hs != h)
    isvedimas();
  paspausta = false;
  analogWrite(ventiliatorius, (reikia[2]) * 255 / 9);
  if (t < reikia[0])
    digitalWrite(temperatura, HIGH);
  else
    digitalWrite(temperatura, LOW);
  if (h < reikia[1])
    digitalWrite(dregme, HIGH);
  else
    digitalWrite(dregme, LOW);
  if (keitimai && ((millis() - laikas2) > 30000))
    issaugom();
}

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.