Простая платформа мониторинга датчиков на базе Arduino для гидропоники — Наука в гидропонике

связанныйrssYouTubeинстаграм

В прошлый раз, когда я писал об автоматизации, я говорил о том, как я использую Arduino для автоматизации мониторинга и управления моей домашней гидропонной системой. Сегодня я хочу поговорить о том, как вы можете построить станцию ​​на основе Arduino для мониторинга наиболее важных параметров вашей гидропонной культуры без необходимости что-либо паять, использовать сложные настройки макетной платы или учиться программировать. Я проведу вас через некоторые шаги по сборке системы, расскажу о необходимых вам компонентах и ​​покажу вам код, который нужно запустить, чтобы эта установка заработала.

Простая платформа мониторинга датчиков на базе Arduino для гидропоники — Наука в гидропонике

Базовое приложение для мониторинга датчиков для гидропоники должно иметь возможность получать наиболее важную информацию, необходимую для успешного выращивания урожая. Основными переменными, которые вы хотели бы контролировать для достижения этой цели, были бы: температура, влажность, концентрация углекислого газа, pH и электропроводность. Микроконтроллер Arduino может помочь вам достичь всех этих целей при меньших затратах по сравнению с имеющимися в продаже решениями для мониторинга того же качества.

Список выше содержит все части, которые вам нужны, чтобы заставить это работать. Это включает в себя Arduino и ЖК-дисплей, который мы будем использовать, чтобы иметь возможность считывать информацию, которую мы получаем от датчиков. Я включил ссылки на части на сайте dfrobot (один из моих любимых источников электроники DIY), но вы определенно можете получить их в другом месте, если хотите. Включенный здесь датчик pH имеет промышленное качество, в то время как датчик EC имеет более низкий уровень качества. Однако я мог использовать оба в течение длительного периода времени без каких-либо дополнительных действий, кроме калибровки примерно раз в 2 месяца. Если вы хотите, вы также можете приобрести датчик EC промышленного качества, если вы обнаружите, что доказательство из прилагаемого набора Gravity недостаточно для ваших нужд.

Самое классное в этой установке то, что ЖК-экран уже содержит все соединения, которые нам нужны для датчиков. Нижняя часть содержит пронумерованные аналоговые входы, а левая часть содержит пронумерованные цифровые входы. В этой установке у нас есть два цифровых датчика — датчик влажности/температуры DHT22 и датчик температуры раствора, который поставляется с датчиком EC, — и три аналоговых датчика: pH, EC и CO.2. Я поместил текст на изображение, чтобы показать вам, где именно вы должны подключить датчики в соответствии с кодом, убедитесь, что порядок цветов на проводах соответствует цветам на разъеме на ЖК-экране. Код Arduino содержит некоторые определения с контактами для каждого датчика, поэтому вы можете просто изменить эти номера, если хотите подключить датчики в разных местах.

//Libraries
#include <DHT.h>;
#include <U8glib.h>
#include <stdio.h>
#include <OneWire.h>
#include <Wire.h>
#include <Arduino.h>
#include <Adafruit_Sensor.h>

//PINS
#define DHT_PIN        5          // DHT pin
#define DHTTYPE        DHT22      // DHT 22  (AM2302)
#define PH_PIN         2          //pH meter pin
#define CO2_PIN        3          //ORP meter pin
#define EC_PIN         1          //EC meter pin
#define DS18B20_PIN    6          //EC solution temperature pin

// AVERAGING VALUES
#define MEDIAN_SAMPLE 8
#define MEASUREMENTS_TAKEN 100

// EC - solution temperature variables
#define StartConvert 0
#define ReadTemperature 1

// EC values // CHANGE THESE PARAMETERS FOR EC PROBE CALIBRATION
#define EC_PARAM_A 0.00754256

//pH values // CHANGE THESE PARAMETERS FOR PH PROBE CALIBRATION
#define PH_PARAM_A 1.0
#define PH_PARAM_B 0.0

#define XCOL_SET 55
#define XCOL_SET2 65
#define XCOL_SET_UNITS 85

//--------------------------

DHT dht(DHT_PIN, DHTTYPE); 
U8GLIB_NHD_C12864 u8g(13, 11, 10, 9, 8); 
unsigned long int avgValue;  
float b, phValue;
int buf[MEASUREMENTS_TAKEN],tmp;
int chk;
float hum;  
float temp;
unsigned int AnalogAverage = 0,averageVoltage=0; 
float solution_temp,ECcurrent; 
unsigned int levelAverage;
float co2;
OneWire ds(DS18B20_PIN); 

//--------------------------

void draw() {
  u8g.setFont(u8g_font_04b_03); 
  
  u8g.drawStr( 0,11,"Temp:");
  u8g.setPrintPos(XCOL_SET,11);
  u8g.print(temp); 
  u8g.drawStr( XCOL_SET_UNITS, 11,"C" ); 
  
  u8g.drawStr(0,21,"Humidity:");
  u8g.setPrintPos(XCOL_SET,21);
  u8g.print(hum);
  u8g.drawStr( XCOL_SET_UNITS,21,"%" );
  
  u8g.drawStr(0,31,"pH:");
  u8g.setPrintPos(XCOL_SET,31);
  u8g.print(phValue);
  
  u8g.drawStr(0,41,"EC:");
  u8g.setPrintPos(XCOL_SET,41);
  u8g.print(ECcurrent);
  u8g.drawStr( XCOL_SET_UNITS,41,"mS/cm" );
  
  u8g.drawStr(0,51,"Sol.Temp:");
  u8g.setPrintPos(XCOL_SET,51);
  u8g.print(solution_temp);
  u8g.drawStr( XCOL_SET_UNITS,51,"C" );
  
  u8g.drawStr(0,61,"CO2:");
  u8g.setPrintPos(XCOL_SET,61);
  u8g.print(co2);
  u8g.drawStr( XCOL_SET_UNITS,61,"ppm" );
  
}

float TempProcess(bool ch)
{
  static byte data[12];
  static byte addr[8];
  static float TemperatureSum;
  if(!ch){
          if ( !ds.search(addr)) {
              ds.reset_search();
              return 0;
          }      
          if ( OneWire::crc8( addr, 7) != addr[7]) {
              return 0;
          }        
          if ( addr[0] != 0x10 && addr[0] != 0x28) {
              return 0;
          }      
          ds.reset();
          ds.select(addr);
          ds.write(0x44,1); 
  }
  else{  
          byte present = ds.reset();
          ds.select(addr);    
          ds.write(0xBE);           
          for (int i = 0; i < 9; i++) { 
            data[i] = ds.read();
          }         
          ds.reset_search();           
          byte MSB = data[1];
          byte LSB = data[0];        
          float tempRead = ((MSB << 8) | LSB); 
          TemperatureSum = tempRead / 16;
    }
          return TemperatureSum;  
}

void calculateAnalogAverage(int pin){
 AnalogAverage = 0;
  
  for(int i=0;i<MEASUREMENTS_TAKEN;i++)       
  { 
    buf[i]=analogRead(pin);
    delay(10);
  }
  for(int i=0;i<MEASUREMENTS_TAKEN-1;i++)        
  {
    for(int j=i+1;j<MEASUREMENTS_TAKEN;j++)
    {
      if(buf[i]>buf[j])
      {
        tmp=buf[i];
        buf[i]=buf[j];
        buf[j]=tmp;
      }
    }
  }
  
  avgValue=0;
  for(int i=(MEASUREMENTS_TAKEN/2)-(MEDIAN_SAMPLE/2);i<(MEASUREMENTS_TAKEN/2)+(MEDIAN_SAMPLE/2);i++){                     
    avgValue+=buf[i];
  }
    
  AnalogAverage = avgValue/MEDIAN_SAMPLE ; 
}

void read_pH(){
  
  calculateAnalogAverage(PH_PIN);
  phValue=(float)AnalogAverage*5.0/1024; 
  phValue=PH_PARAM_A*phValue+PH_PARAM_B;    
}

void read_EC(){
  
  calculateAnalogAverage(EC_PIN);
  
  solution_temp = TempProcess(ReadTemperature);  
  TempProcess(StartConvert);                   
  
  averageVoltage=AnalogAverage*(float)5000/1024;
  float TempCoefficient=1.0+0.0185*(solution_temp-25.0);   
  float CoefficientVolatge=(float)averageVoltage*TempCoefficient;   
  
  ECcurrent=EC_PARAM_A*CoefficientVolatge;     
}

void read_CO2(){
  float voltage;
  float voltage_difference;
  calculateAnalogAverage(CO2_PIN); 
  voltage = AnalogAverage*(5000/1024.0); 
  
  if(voltage == 0)
  {
    co2=-100.0;
  }
  else if(voltage < 400)
  {
    co2=0.0;
  }
  else
  {
    voltage_difference=voltage-400;
    co2=voltage_difference*50.0/16.0;
  }
}

void setup()
{
    pinMode(13,OUTPUT);  
    Serial.begin(9600);
    
    dht.begin();
    u8g.setContrast(0);
    u8g.setRot180();
    TempProcess(StartConvert);   
}

void loop()
{
 
  digitalWrite(13, HIGH);       
  delay(800);
  digitalWrite(13, LOW);   
    
  hum = dht.readHumidity();
  temp= dht.readTemperature(); 
  read_pH();
  read_EC();
  read_CO2();

  u8g.firstPage();
    do  {
      draw();
    } 
      while( u8g.nextPage() );          
      
}

После подключения датчиков вы можете загрузить приведенный выше код с помощью Arduino IDE на Arduino через USB. Вам нужно будет установить следующие библиотеки Arduino, чтобы скомпилировать и загрузить:

После того, как вы загрузите это в свой Arduino, он должен запуститься и показать вам экран с показаниями температуры, влажности, pH, EC и углекислого газа. Вначале концентрация углекислого газа может отображаться как -100, что просто означает, что датчик нагревается (требуется несколько минут, прежде чем он сможет начать давать показания).

Также стоит отметить, что вам следует откалибровать датчик pH. Для этого вы должны считать pH буфера 7,0 (M7) – записать полученное значение, а затем повторить процесс с буфером pH 4,0 (M4). Затем вы можете изменить значения PH_PARAM_A и PH_PARAM_B в коде (в самом начале), чтобы датчик соответствовал вашим измерениям. Параметр PH_PARAM_A должен быть равен 3/(M7-M4), а PH_PARAM_B должен быть равен 7-M7*PH_PARAM_A. Если вам когда-нибудь понадобится перекалибровать, установите PH_PARAM_A на 1 и PH_PARAM_B на 0 и повторите процесс. Для датчика EC вы должны выполнить калибровку, используя раствор 1,412 мСм/см, который поставляется с датчиком, а затем изменить EC_PARAM_A, чтобы ваш датчик соответствовал этому показанию (1,412/(MEC/0,00754256)).

С этой новой станцией мониторинга у вас теперь должен быть мощный инструмент для мониторинга вашей гидропонной системы и обеспечения того, чтобы все было там, где вы хотите. Конечно, заставить Arduino взаимодействовать с компьютером для записи этих значений, а затем реализовать механизмы управления с использованием вентиляторов, перистальтических насосов, водяных насосов, увлажнителей/осушителей и других устройств — это следующий шаг по сложности.

Фейсбуктвиттерреддитпинтерестсвязанный