标题:
arduino SCoop多线程库和PS2键盘应用—arduino智能温室
[打印本页]
作者:
阿斯顿ll
时间:
2020-3-11 19:40
标题:
arduino SCoop多线程库和PS2键盘应用—arduino智能温室
由于都知道的原因,最近楼主在家闲来无事,搞了个这个项目。新人第一个项目,有可改进之处请不吝赐教!
具体功能:
1.温湿度控制。通过土壤湿度传感器获取土壤湿度,达到阈值时启动水泵;通过lm35温度传感器获取环境温度,
达到阈值时启动风扇(水泵,风扇用8050三极管驱动);
2.温湿度显示。这个就不用多说了,用2004i2c接口lcd显示温湿度;
3.时间显示。通过ds1302芯片获取时间;显示在lcd上;
4.温湿度阈值与时间更改。通过ps2键盘更改温湿度阈值,将数据储存在eeprom中,开机自动读取
硬件部分暂时还没搞完,是把arduino搞出最小系统焊到洞洞板上,在接外设。由于师傅作业奇多(网课),估计得一段时间了。
代码:
附上用到的库:
DS1302.zip
(124.53 KB, 下载次数: 5)
2020-3-11 19:38 上传
点击文件名下载附件
da1302时钟库
下载积分: 黑币 -5
SCoop.zip
(35.81 KB, 下载次数: 15)
2020-3-11 19:38 上传
点击文件名下载附件
多线程scoop库
下载积分: 黑币 -5
作者:
阿斯顿ll
时间:
2020-3-12 10:27
。。。。。代码不见了 重新传
#include <LiquidCrystal_I2C.h>
#include <DS1302.h>
#include <PS2Keyboard.h>
#include <EEPROM.h>
#include <SCoop.h>
#include <stdlib.h>
#define tvaddr 0
#define lvaddr 1
#define wvaddr 2
LiquidCrystal_I2C lcd_0(0x27, 20, 4);
DS1302 rtc(8, 7, 6);
PS2Keyboard keyboard;
int led_0 = A0;
int m1 = 1;
int m2 = 4;
int lightSensor_0 = A1;
int soilhumi = A2;
int lm35 = A3;
int temp;
int humi;
int illu;
bool op = 0;
String t;
char tv1;
String tv2;
int tv3;
char lv1;
String lv2;
int lv3;
char wv1;
String wv2;
int wv3;
char op1;
String op2;
int op3;
char np1;
String np2;
int np3;
char ip1;
String ip2;
int ip3;
char c;
const int DataPin = 3;
const int IRQpin = 2;
int numdata[7] = {0};
void setup()
{
lcd_0.init();
lcd_0.backlight();
lcd_0.setCursor(4, 0);
lcd_0.print("Intellegent");
lcd_0.setCursor(2, 1);;
lcd_0.print("Greenhouse v4.0");
lcd_0.setCursor(6, 2);
lcd_0.print("based on");
lcd_0.setCursor(3, 3);
lcd_0.print("ATmega 328p-pu");
delay(2000);
lcd_0.clear();
lcd_0.setCursor(3, 0);
lcd_0.print("Setting up...");
pinMode(led_0, OUTPUT);
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(lightSensor_0, INPUT);
pinMode(soilhumi, INPUT);
keyboard.begin(DataPin, IRQpin);
tv3 = EEPROM.read(tvaddr);
lv3 = EEPROM.read(lvaddr);
wv3 = EEPROM.read(wvaddr);
delay(1200);
lcd_0.clear();
rtc.setTCR(TCR_OFF);
rtc.halt(false);
/*rtc.writeProtect(false);
rtc.setDOW(WEDNESDAY);
rtc.setTime(19, 41, 00);
rtc.setDate(11, 3, 2020);
rtc.writeProtect(true);*/
lcd_0.setCursor(0, 1);
lcd_0.print("illu");
lcd_0.setCursor(0, 2);
lcd_0.print("humi");
lcd_0.setCursor(0, 3);
lcd_0.print("temp");
mySCoop.start();
}
void loop()
{
yield();
}
defineTaskLoop(Getdata)
{
humi = map(analogRead(soilhumi), 0, 1023, 100, 0);
illu = map(analogRead(lightSensor_0), 0, 1023, 0, 102.3);
temp = (5 * analogRead(lm35) * 100)/1024;
}
defineTaskLoop(Operate)
{
if (illu < lv3)
{
digitalWrite(led_0, HIGH);
}
else
{
digitalWrite(led_0, LOW);
}
if (temp < tv3-1)
{
digitalWrite(m1, LOW);
}
else if (temp > tv3+1)
{
digitalWrite(m1, HIGH);
}
if (humi < wv3)
{
digitalWrite(m2, HIGH);
}
else
{
digitalWrite(m2, LOW);
}
if(keyboard.available())
{
if(keyboard.read == PS2_F1)
{
menu();
}
}
clockdate();
}
defineTaskLoop(Display)
{
lcd_0.setCursor(7, 1);
lcd_0.print(illu);
lcd_0.setCursor(7, 2);
lcd_0.print(humi);
lcd_0.setCursor(7, 3);
lcd_0.print(temp);
if (illu < 10)
{
lcd_0.setCursor(8, 1);
lcd_0.print(" ");
}
if (illu < 100)
{
lcd_0.setCursor(9, 1);
lcd_0.print(" ");
}
if (humi < 100)
{
lcd_0.setCursor(9, 3);
lcd_0.print(" ");
}
if (humi < 10)
{
lcd_0.setCursor(8, 3);
lcd_0.print(" ");
}
if (temp < 100)
{
lcd_0.setCursor(9, 2);
lcd_0.print(" ");
}
if (temp < 10)
{
lcd_0.setCursor(8, 2);
lcd_0.print(" ");
}
}
void clockdate()
{
lcd_0.setCursor(0, 0);
lcd_0.print(rtc.getDateStr(FORMAT_LONG,FORMAT_LITTLEENDIAN, '/'));// check 1302 library and see FORMAT_BIGENDIAN:2010-01-01;FORMAT_LITTLEENDIAN:01-01-2010
lcd_0.print(" ");
lcd_0.print(rtc.getDOWStr());
lcd_0.print(" ");
lcd_0.print(rtc.getTimeStr());
}
void menu()
{
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("1--set time");
lcd_0.setCursor(0, 1);
lcd_0.print("2--set temp vaule");
lcd_0.setCursor(0, 2);
lcd_0.print("3--set light vaule");
lcd_0.setCursor(0, 3);
lcd_0.print("4--set water vaule");
c = keyboard.read();
switch (c)
{
case 1:
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Input:y,m,d,h,m,s,w.");
lcd_0.setCursor(0, 1);
lcd_0.print("Divide by ','");
t += char(keyboard.read());
lcd_0.setCursor(0, 2);
lcd_0.print(t);
delay(6000);
int j = 0;
for(int i = 0; i < t.length() ; i++)
{
if(t[i] == ',')
{
j++;
}
else
{
numdata[j] = numdata[j] * 10 + (t[i] - '0');
}
}
t = String("");
for(int i = 0; i < 7; i++)
{
numdata[i] = 0;
}
rtc.writeProtect(false);
rtc.setDOW(numdata[6]);
rtc.setTime(numdata[3], numdata[4], numdata[5]);
rtc.setDate(numdata[2], numdata[1], numdata[0]-2000);
rtc.writeProtect(true);
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Time had been set!");
delay(1500);
break;
case 2:
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Input temp value:");
tv1 = keyboard.read();
lcd_0.setCursor(0, 1);
lcd_0.print(tv1);
if (isDigit(tv1))
{
tv2 += tv1;
}
else if (tv1 == PS2_ENTER)
{
tv3 = tv2.toInt();
EEPROM.update(tvaddr, tv3);
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Tv had been set");
delay(1500);
}
break;
case 3:
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Input light value:");
lv1 = keyboard.read();
lcd_0.setCursor(0, 1);
lcd_0.print(lv1);
if (isDigit(lv1))
{
lv2 += lv1;
}
else if (lv1 == PS2_ENTER)
{
lv3 = lv2.toInt();
EEPROM.update(lvaddr, lv3);
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Lv had been set");
delay(1500);
}
break;
case 4:
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Input water value:");
wv1 = keyboard.read();
lcd_0.setCursor(0, 1);
lcd_0.print(wv1);
if (isDigit(wv1))
{
wv2 += wv1;
}
else if (wv1 == PS2_ENTER)
{
wv3 = wv2.toInt();
EEPROM.update(wvaddr, wv3);
lcd_0.clear();
lcd_0.setCursor(0, 0);
lcd_0.print("Wv had been set");
delay(1500);
}
break;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1