开源的生态缸自动光照系统


MAKER:Giannis Vasilakis/译:趣无尽 Cherry(转载请注明出处)
本次教程介绍一款从原理图、PCB、源码、3D外壳图纸齐全的开源小项目,小巧实用的生态缸光照系统。该项目是基于 Atmega328p 微控制器和 Arduino 制作,很适合拿来练手。

功能特性:
1、支持通过串行监视器设置系统时间。
2、通过编程控制光照时间和颜色。

观看视频,感受一下灯光的实际效果:

下面罗列了主要的部件和资源,具体的 DIY 操作步骤不再赘述,如有问题欢迎在「趣小组」(https://talk.quwj.com) 交流。

材料清单


定制 PCB 电路板×1
Atmega328×1(带 Arduino UNO bootloader)
NeoPixel RGB LED 防水灯×1
DS1307串行 RTC×1
28 DIP插座×1
8 DIP插座×1
16 MHz 晶振×1
32.768 MHz 晶振×1
22 pF 电容×2
10 k电阻×3
纽扣电池座×1
2.54mm 2P 螺丝端子×1
2.54mm 5 针排针×1
电线×5
TTL 转 USB 模块×1(可选)
Arduino UNO 或 TTL 转 USB 模块

电路原理图和 PCB



如需下载和编辑,可以在这里查看:
https://easyeda.com/mi.vasilakis/Aquarium_RGB_Led_light-99e1c88d0aed47d3a384e2086172e1bf

编程

用五根线将 TTL 转 USB 模块与 PCB 上的TX、RX、RS、GND、5V相连,其中引脚 RX 和 TX 必须交叉连接。
注意:如果你使用的是 Arduino UNO,请先从板子上取下 ATmega328 芯片,然后将板子的 RX 接头连接到 RX 引脚,将 TX 接头连接到 TX 引脚。 RS 引脚必须连接到 Arduino UNO 复位引脚。

/*  Arduino based - Aquarium Auto Lighing System
 *  More info can be found at: http://www.ardumotive.com
 *  Dev:Michalis Vasilakis Date:21/2/2018 Var:1.0  
*/

//Libraries (many thanks to Developers)
#include <Adafruit_NeoPixel.h>
#include <RTClib.h>


//Constants
const int DIN = 2;    //Neopixel DIN pin to Arduino Pin 2
const int PIXELS = 29; //How many neopixel leds do you have?
RTC_DS1307 rtc;       //Create an object for DS1307 I2C library
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(PIXELS, DIN, NEO_GRB + NEO_KHZ800); //Create an object for NeoPixel library

//Variables;
int H,M; //H for hour and M for minutes
String Time; // Use readTime(); Serial.print(Time); for printing the time in serial monitor
//Variables For color setting
boolean newColor = false;
int r=0;
int g=0;
int b=0;
//Following variables are used for the time setting from serial monitor
boolean newMessage = false;
boolean messageCompleted = false;
char incomingByte; 
String command;
//Delay without delay() for fade
unsigned long previousMillis = 0;
const long interval = 250; //Change this value (ms) 


void setup() {
  pixels.begin(); //Initialize the NeoPixel library
  rtc.begin();    //Initialize the RTC DS1307 library
  Serial.begin(9600); 
  //This will run only if the rtc battery is low or rtc ic has wrong time set
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // This line sets the RTC with an explicit date & time, for example to set
    // January 1, 2018 at 00:00am you would call:
    rtc.adjust(DateTime(2018, 01, 01, 00, 00, 0)); 
  }
  Serial.println("Aquarium Auto Lighting System"); 
  Serial.println("Visit the www.Ardumotive.com for more info \n");
  readTime();
  Serial.println(Time);
  Serial.println("- To set the time send '<SHH:MM>' (example: <S14:05>)");
}

void loop() {
  setTime(); //Check for serial set command
  readTime();

  //Change time and color values bellow if you want
  //From 00:00 to 07:00
  if (H>=0 && H <7) {
    setColor(0,0,50);
  }
  //From 07:00 to 12:00
  else if (H>=7 && H<12){
    setColor(50,50,100);
  }
  else if( H>=12 && H<19){
    setColor(180,180,180);
  }
  else if (H>=19 && H<21){
    setColor(50,50,100);
  } 
}
//Send color to led strip
void setColor(int R,int G,int B){
  while ((r!=R) || (g!=G) || (b!=B)){
      setTime(); //Check for serial set command

    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      for(int i=0;i<PIXELS;i++){
        // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
        pixels.setPixelColor(i, pixels.Color(r,g,b)); 
        pixels.show(); 
      } 
      if (r!=R && r<R){
        r++;
      }
      else if (r!=R && r>R){
        r--;
      }
      if (g!=G && g<G){
        g++;
      }
      else if (g!=G && g>G){
        g--;
      }
      if (b!=B && b<B){
        b++;
      }
      else if (b!=B && b>B){
        b--;
      }
    }
   }
}

//Read time from RTC
void readTime(){
  DateTime now = rtc.now();
  H = now.hour();
  M = now.minute();
  Time = "Current time in RTC: " + String(H) + ":" + String(M);
} 

//Set time, send <SHH:MM> (example <S05:00>)
void setTime(){
  if (Serial.available()){
    incomingByte = Serial.read();
    if(incomingByte=='>'){
       messageCompleted=true;
       newMessage=false;
    }
    else if (incomingByte=='<'){
       newMessage=true;
    }
    if (newMessage){
       command.concat(incomingByte);
    }
  }
  if(messageCompleted){
    //Set time
    if (command.charAt(1)=='S'){
      int h = (command.substring(2,4)).toInt();
      int m = (command.substring(5,7)).toInt();
      rtc.adjust(DateTime(2018,01,01,h,m,0));
      Serial.println("Done");
      readTime();
      Serial.println(Time);
    }
    command="";
    messageCompleted=false;
  }
}

代码文件在项目文件库中下载:
https://make.quwj.com/project/152

3D 打印外壳



3D 打印图纸在项目文件库中下载:
https://make.quwj.com/project/152

完成!


希望你喜欢这个项目,点亮起你的鱼缸。

via

坐沙发

发表评论