找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2366|回复: 1
收起左侧

arduino SCoop多线程库和PS2键盘应用—arduino智能温室

[复制链接]
ID:639372 发表于 2020-3-11 19:40 | 显示全部楼层 |阅读模式
由于都知道的原因,最近楼主在家闲来无事,搞了个这个项目。新人第一个项目,有可改进之处请不吝赐教!
具体功能:
1.温湿度控制。通过土壤湿度传感器获取土壤湿度,达到阈值时启动水泵;通过lm35温度传感器获取环境温度,达到阈值时启动风扇(水泵,风扇用8050三极管驱动);
2.温湿度显示。这个就不用多说了,用2004i2c接口lcd显示温湿度;
3.时间显示。通过ds1302芯片获取时间;显示在lcd上;
4.温湿度阈值与时间更改。通过ps2键盘更改温湿度阈值,将数据储存在eeprom中,开机自动读取
硬件部分暂时还没搞完,是把arduino搞出最小系统焊到洞洞板上,在接外设。由于师傅作业奇多(网课),估计得一段时间了。

代码:

附上用到的库:
DS1302.zip (124.53 KB, 下载次数: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:639372 发表于 2020-3-12 10:27 | 显示全部楼层
。。。。。代码不见了 重新传
  1. #include <LiquidCrystal_I2C.h>
  2. #include <DS1302.h>
  3. #include <PS2Keyboard.h>
  4. #include <EEPROM.h>
  5. #include <SCoop.h>
  6. #include <stdlib.h>

  7. #define tvaddr 0
  8. #define lvaddr 1
  9. #define wvaddr 2

  10. LiquidCrystal_I2C lcd_0(0x27, 20, 4);
  11. DS1302 rtc(8, 7, 6);
  12. PS2Keyboard keyboard;

  13. int led_0 = A0;
  14. int m1 = 1;
  15. int m2 = 4;
  16. int lightSensor_0 = A1;
  17. int soilhumi = A2;
  18. int lm35 = A3;
  19. int temp;
  20. int humi;
  21. int illu;
  22. bool op = 0;
  23. String t;
  24. char tv1;
  25. String tv2;
  26. int tv3;
  27. char lv1;
  28. String lv2;
  29. int lv3;
  30. char wv1;
  31. String wv2;
  32. int wv3;
  33. char op1;
  34. String op2;
  35. int op3;
  36. char np1;
  37. String np2;
  38. int np3;
  39. char ip1;
  40. String ip2;
  41. int ip3;
  42. char c;
  43. const int DataPin = 3;
  44. const int IRQpin =  2;
  45. int numdata[7] = {0};

  46. void setup()
  47. {
  48.     lcd_0.init();
  49.     lcd_0.backlight();
  50.     lcd_0.setCursor(4, 0);
  51.     lcd_0.print("Intellegent");
  52.     lcd_0.setCursor(2, 1);;
  53.     lcd_0.print("Greenhouse  v4.0");
  54.     lcd_0.setCursor(6, 2);
  55.     lcd_0.print("based on");
  56.     lcd_0.setCursor(3, 3);
  57.     lcd_0.print("ATmega 328p-pu");
  58.     delay(2000);
  59.     lcd_0.clear();
  60.     lcd_0.setCursor(3, 0);
  61.     lcd_0.print("Setting up...");
  62.     pinMode(led_0, OUTPUT);
  63.     pinMode(m1, OUTPUT);
  64.     pinMode(m2, OUTPUT);
  65.     pinMode(lightSensor_0, INPUT);
  66.     pinMode(soilhumi, INPUT);
  67.     keyboard.begin(DataPin, IRQpin);
  68.     tv3 = EEPROM.read(tvaddr);
  69.     lv3 = EEPROM.read(lvaddr);
  70.     wv3 = EEPROM.read(wvaddr);  
  71.     delay(1200);
  72.     lcd_0.clear();
  73.     rtc.setTCR(TCR_OFF);
  74.     rtc.halt(false);
  75.     /*rtc.writeProtect(false);
  76.     rtc.setDOW(WEDNESDAY);         
  77.     rtc.setTime(19, 41, 00);      
  78.     rtc.setDate(11, 3, 2020);   
  79.     rtc.writeProtect(true);*/
  80.     lcd_0.setCursor(0, 1);
  81.     lcd_0.print("illu");
  82.     lcd_0.setCursor(0, 2);
  83.     lcd_0.print("humi");
  84.     lcd_0.setCursor(0, 3);
  85.     lcd_0.print("temp");
  86.     mySCoop.start();
  87. }

  88. void loop()
  89. {
  90.     yield();
  91. }

  92. defineTaskLoop(Getdata)
  93. {
  94.     humi = map(analogRead(soilhumi), 0, 1023, 100, 0);
  95.     illu = map(analogRead(lightSensor_0), 0, 1023, 0, 102.3);
  96.     temp = (5 * analogRead(lm35) * 100)/1024;
  97. }

  98. defineTaskLoop(Operate)
  99. {
  100.     if (illu < lv3)
  101.     {
  102.         digitalWrite(led_0, HIGH);
  103.     }
  104.     else
  105.     {
  106.         digitalWrite(led_0, LOW);
  107.     }
  108.      if (temp < tv3-1)
  109.      {
  110.        digitalWrite(m1, LOW);
  111.      }
  112.      else if (temp > tv3+1)
  113.      {
  114.        digitalWrite(m1, HIGH);
  115.      }
  116.     if (humi < wv3)
  117.     {
  118.         digitalWrite(m2, HIGH);
  119.     }
  120.     else
  121.     {
  122.         digitalWrite(m2, LOW);
  123.     }
  124.     if(keyboard.available())
  125.     {
  126.       if(keyboard.read == PS2_F1)
  127.       {
  128.         menu();
  129.       }
  130.     }
  131.     clockdate();
  132. }

  133. defineTaskLoop(Display)
  134. {
  135.     lcd_0.setCursor(7, 1);
  136.     lcd_0.print(illu);
  137.     lcd_0.setCursor(7, 2);
  138.     lcd_0.print(humi);
  139.     lcd_0.setCursor(7, 3);
  140.     lcd_0.print(temp);
  141.     if (illu < 10)
  142.     {
  143.        lcd_0.setCursor(8, 1);
  144.        lcd_0.print(" ");
  145.     }
  146.     if (illu < 100)
  147.     {
  148.        lcd_0.setCursor(9, 1);
  149.        lcd_0.print(" ");
  150.     }
  151.     if (humi < 100)
  152.     {
  153.        lcd_0.setCursor(9, 3);
  154.        lcd_0.print(" ");
  155.     }
  156.     if (humi < 10)
  157.     {
  158.        lcd_0.setCursor(8, 3);
  159.        lcd_0.print(" ");
  160.     }
  161.     if (temp < 100)
  162.     {
  163.        lcd_0.setCursor(9, 2);
  164.        lcd_0.print(" ");
  165.     }
  166.     if (temp < 10)
  167.     {
  168.        lcd_0.setCursor(8, 2);
  169.        lcd_0.print(" ");
  170.     }
  171. }

  172. void clockdate()
  173. {  
  174.       lcd_0.setCursor(0, 0);
  175.       lcd_0.print(rtc.getDateStr(FORMAT_LONG,FORMAT_LITTLEENDIAN, '/'));// check 1302 library and see FORMAT_BIGENDIAN:2010-01-01;FORMAT_LITTLEENDIAN:01-01-2010
  176.       lcd_0.print(" ");
  177.       lcd_0.print(rtc.getDOWStr());
  178.       lcd_0.print(" ");
  179.       lcd_0.print(rtc.getTimeStr());
  180. }

  181. void menu()
  182. {
  183.     lcd_0.clear();
  184.     lcd_0.setCursor(0, 0);
  185.     lcd_0.print("1--set time");
  186.     lcd_0.setCursor(0, 1);
  187.     lcd_0.print("2--set temp vaule");
  188.     lcd_0.setCursor(0, 2);
  189.     lcd_0.print("3--set light vaule");
  190.     lcd_0.setCursor(0, 3);
  191.     lcd_0.print("4--set water vaule");
  192.     c = keyboard.read();
  193.     switch (c)
  194.     {
  195.       case 1:
  196.       lcd_0.clear();
  197.       lcd_0.setCursor(0, 0);
  198.       lcd_0.print("Input:y,m,d,h,m,s,w.");
  199.       lcd_0.setCursor(0, 1);
  200.       lcd_0.print("Divide by ','");
  201.       t += char(keyboard.read());
  202.       lcd_0.setCursor(0, 2);
  203.       lcd_0.print(t);
  204.       delay(6000);
  205.       int j = 0;
  206.       for(int i = 0; i < t.length() ; i++)
  207.       {
  208.         if(t[i] == ',')
  209.         {
  210.           j++;
  211.         }
  212.         else
  213.         {
  214.           numdata[j] = numdata[j] * 10 + (t[i] - '0');
  215.         }
  216.       }
  217.       t = String("");
  218.       for(int i = 0; i < 7; i++)
  219.       {
  220.         
  221.         numdata[i] = 0;
  222.       }
  223.       rtc.writeProtect(false);
  224.       rtc.setDOW(numdata[6]);         
  225.       rtc.setTime(numdata[3], numdata[4], numdata[5]);      
  226.       rtc.setDate(numdata[2], numdata[1], numdata[0]-2000);   
  227.       rtc.writeProtect(true);
  228.       lcd_0.clear();
  229.       lcd_0.setCursor(0, 0);
  230.       lcd_0.print("Time had been set!");
  231.       delay(1500);
  232.       break;

  233.       case 2:
  234.       lcd_0.clear();
  235.       lcd_0.setCursor(0, 0);
  236.       lcd_0.print("Input temp value:");
  237.       tv1 = keyboard.read();
  238.       lcd_0.setCursor(0, 1);
  239.       lcd_0.print(tv1);
  240.       if (isDigit(tv1))
  241.       {
  242.         tv2 += tv1;
  243.       }
  244.       else if (tv1 == PS2_ENTER)
  245.       {
  246.         tv3 = tv2.toInt();
  247.         EEPROM.update(tvaddr, tv3);
  248.         lcd_0.clear();
  249.         lcd_0.setCursor(0, 0);
  250.         lcd_0.print("Tv had been set");
  251.         delay(1500);
  252.       }      
  253.       break;

  254.       case 3:
  255.       lcd_0.clear();
  256.       lcd_0.setCursor(0, 0);
  257.       lcd_0.print("Input light value:");
  258.       lv1 = keyboard.read();
  259.       lcd_0.setCursor(0, 1);
  260.       lcd_0.print(lv1);
  261.       if (isDigit(lv1))
  262.       {
  263.         lv2 += lv1;
  264.       }
  265.       else if (lv1 == PS2_ENTER)
  266.       {
  267.         lv3 = lv2.toInt();
  268.         EEPROM.update(lvaddr, lv3);
  269.         lcd_0.clear();
  270.         lcd_0.setCursor(0, 0);
  271.         lcd_0.print("Lv had been set");
  272.         delay(1500);
  273.       }      
  274.       break;

  275.       case 4:
  276.       lcd_0.clear();
  277.       lcd_0.setCursor(0, 0);
  278.       lcd_0.print("Input water value:");
  279.       wv1 = keyboard.read();
  280.       lcd_0.setCursor(0, 1);
  281.       lcd_0.print(wv1);
  282.       if (isDigit(wv1))
  283.       {
  284.         wv2 += wv1;
  285.       }
  286.       else if (wv1 == PS2_ENTER)
  287.       {
  288.         wv3 = wv2.toInt();
  289.         EEPROM.update(wvaddr, wv3);
  290.         lcd_0.clear();
  291.         lcd_0.setCursor(0, 0);
  292.         lcd_0.print("Wv had been set");
  293.         delay(1500);
  294.       }      
  295.       break;
  296.     }
  297. }
复制代码

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表