本次教程介绍一款从原理图、PCB、源码、3D外壳图纸齐全的开源小项目,小巧实用的生态缸光照系统。该项目是基于 Atmega328p 微控制器和 Arduino 制作,很适合拿来练手。
功能特性:
1、支持通过串行监视器设置系统时间。
2、通过编程控制光照时间和颜色。
观看视频,感受一下灯光的实际效果:
https://v.qq.com/x/page/x3004kncuxl.html
下面罗列了主要的部件和资源,具体的 DIY 操作步骤不再赘述,如有问题欢迎在「趣小组」(https://talk.quwj.com) 交流。
AquaBox1.stl
[63484 Bytes at 2019-10-05, 12 次下载]
AquaBox2.stl
[548084 Bytes at 2019-10-05, 10 次下载]
aquariumautolighting.zip
[54279 Bytes at 2019-10-05, 11 次下载]
定制 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 模块
如需下载和编辑,可以在这里查看:
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 打印图纸在项目文件库中下载:
https://make.quwj.com/project/152
希望你喜欢这个项目,点亮起你的鱼缸。