تجزیه و تحلیل رو ول کن.:d
کد رو بزار تا نگاش کنیم
نمایش نسخه قابل چاپ
تجزیه و تحلیل رو ول کن.:d
کد رو بزار تا نگاش کنیم
کد:#include <Bounce2.h>
#include <DHT.h>
#include <LiquidCrystal.h>
#define setBUTTON 13
#define upBUTTON 12
#define downBUTTON 11
#define DHTPIN 2
#define DHTTYPE DHT21
Bounce set;
Bounce up;
Bounce down;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8, 7, 6, 5, 4, 3);
const int temprelay = 10, humidityrelay = 9;
float temp,hum;
const float i=temp, j=hum;
void setup() {
lcd.begin(16, 2);
lcd.clear();
dht.begin();
set.attach (setBUTTON);
set.interval(50);
up.attach (upBUTTON);
up.interval(50);
down.attach (downBUTTON);
down.interval(50);
pinMode (setBUTTON, INPUT_PULLUP);
pinMode (upBUTTON, INPUT_PULLUP);
pinMode (downBUTTON, INPUT_PULLUP);
}
void loop() {
set.update();
up.update();
down.update();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Failed to read ");
lcd.setCursor(0,1);
lcd.print("from DHT sensor!");
delay(2000);
lcd.clear();
return;
}
if ((t) >= i){
digitalWrite (temprelay, HIGH);
}
else if ((t) <= i-5)
{
digitalWrite (temprelay, LOW);
}
if ((h) >= j){
digitalWrite (humidityrelay, LOW);
}
else if ((h) <=j-12)
{
digitalWrite (humidityrelay, HIGH);
}
lcd.print("Humidity:");
lcd.setCursor(10,0);
lcd.print(h);
lcd.setCursor(15,0);
lcd.print("%");
lcd.setCursor(1,1);
lcd.print("Temp:");
lcd.setCursor(7,1);
lcd.print(t);
lcd.setCursor(12,1);
lcd.print(" *C ");
}
الان مشکل کجاست؟
توی این کد هیچ مشکلی نیست ، قبلا هم گفتم که میخوام سه تا کلید وصل کنم به آردینو یک کلید بالا و یک کلید پایین برای کم و زیاد کردن و یک کلید هم برای رفتن به تنظیمات.
در واقع میخوام وقتی که دفعه ی اول که کلید تنظیمات رو فشار دادم تنظیمات temp نمایش داده بشه و با دو کلید up و down دما رو کم و زیاد کنم و دفعه ی دوم که کلید تنظیمات رو فشار دادم بتونم رطوبت رو توش تنظیم کنم با کلید up و down.
حالا چرا میخوام دما و رطوبت رو تنظیم کنم؟؟؟
چون توی این گلخانه ای که قراره سنسور نصب بشه رطوبت باید 80 تا 90 درصد باشه و دما هم باید 20 تا 25 درجه. برای مثال ما دما رو روی 20 درجه توسط کلید تنظیم و کلید های up و down و رطوبت رو روی 85 درصد تنظیم میکنیم. خوب آردینو این اعداد رو که بهش دادیم رو میگیره و یه عمل مقایسه بین این اعدادی که ما بهش دادیم و اعدادی که سنسور dht21 نشون میده انجام میده. خوب ما دما رو روی 20 درجه تنظیم کرده بودیم حالا اگر دمای گلخانه بالای 20 رفت مثلا شد 25 ، اردینو یک رله رو که به یکی از این پین ها متصله فعال کرده و رله هواکش رو روشن میکنه و تهویه انجام میشه تا دما به چند درجه زیر 20 برسه مثلا 16 یا 17. حالا چرا زیر 20؟ چون اگه دما دوباره روی 20 بیاد و آردینو تهویه رو خاموش کنه خوب مسلمه که دقت سنسور نیم درجه است و اگه یک لحظه بیشتر از 20 درجه تشخیص بده دوباره فن روشن میشه.
حالا در مورد رطوبت: خوب ما رطوبت رو روی 85 درصد تنظیم کرده بودیم ، حالا فرض کنید رطوبت محیط 50 درصد باشه خوب مسلمه که آردینو رله ی مخصوص رطوبت رو فعال میکنه و بدین ترتیب دستگاه رطوبت ساز فعال میشه و اونقدر رطوبت تولید میکنه تا رطوبت برسه به 85 درصد و رله قطع بشه و دستگاه رطوبت ساز خاموش شه و تا وقتی دوباره رطوبت به زیر 80 نرسیده رطوبت ساز توسط آردینو روشن نشه.
من فقط تونستم تا یه جایی کد نویسی کنم که کد هم گذاشتم واستون. و تمام چیز هایی که اینجا گفتم رو دیگه در توان من نیست برنامه نویسی کنم چون بیش از یک ماه نیست که دارم با آردینو کار میکنم لطفا کمکم کنید و راه های نوشتن این برنامه رو بگید که از چه دستوراتی میتونم استفاده کنم تا پروژه رو تکمیل کنم.
سپاس فراوان از شما و ببخشید که زیاد نوشتم.
اول یه نکته بگم:
متغیر از نوع float ، اعشاری می باشد.
تو این مواقع باید از نوع int (عدد صحیح) تعریف کنی تا مثلا توی برنامه وقتی می خوای بگی
اگه برابر 80 درصد شدی:
تابع مثلا سلام رو اجرا کن.
حالا برنامه رو نگاه می کنم و مورد های بعدی رو بهت می گم.
ببین کدت رو به شکل تابع نویسی در آوردم
اینو آپلود کن ببین همه چیز درسته یا نه
و این که یه نکته تو وقتی از شرط خارج میشی داری به پین دیجیتال متصل به رله دستور high میدی مگه رله تو 1 فعاله ؟
مدل رله ای که استفاده می کنی چیه؟
کد:#include <Bounce2.h>
#include <DHT.h>
#include <LiquidCrystal.h>
#define setBUTTON 13
#define upBUTTON 12
#define downBUTTON 11
#define DHTPIN 2
#define DHTTYPE DHT21
Bounce set;
Bounce up;
Bounce down;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8, 7, 6, 5, 4, 3);
float h, t, tset = 25, hset = 80;
void setup() {
project_config();
}
//*******************
void loop() {
button_update();
DHT_Read();
compare_setpoint(tset, hset, t, h);
data_Show(h, t);
}
//*******************
void project_config() {
lcd.begin(16, 2);
lcd.clear();
dht.begin();
set.attach (setBUTTON);
set.interval(50);
up.attach (upBUTTON);
up.interval(50);
down.attach (downBUTTON);
down.interval(50);
pinMode (setBUTTON, INPUT_PULLUP);
pinMode (upBUTTON, INPUT_PULLUP);
pinMode (downBUTTON, INPUT_PULLUP);
}
//*******************
void DHT_Read() {
h = dht.readHumidity();
t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Failed to read ");
lcd.setCursor(0, 1);
lcd.print("from DHT sensor!");
delay(2000);
lcd.clear();
return;
}
}
//*******************
void data_Show(float temprature, float humidity) {
lcd.print("Humidity:");
lcd.setCursor(10, 0);
lcd.print(humidity);
lcd.setCursor(15, 0);
lcd.print("%");
lcd.setCursor(1, 1);
lcd.print("Temp:");
lcd.setCursor(7, 1);
lcd.print(temprature);
lcd.setCursor(12, 1);
lcd.print(" *C ");
}
//*******************
void compare_setpoint(float tempsetpint , float humidsetpoint, float tempr, float humidi) {
const int temprelay = 10, humidityrelay = 9;
if (tempr >= tempsetpint) {
digitalWrite (temprelay, HIGH);
}
else if (tempr <= tempsetpint - 5)
{
digitalWrite (temprelay, LOW);
}
if (humidi >= humidsetpoint) {
digitalWrite (humidityrelay, LOW);
}
else if (humidi <= humidsetpoint - 12)
{
digitalWrite (humidityrelay, HIGH);
}
}
//*******************
void button_update() {
set.update();
up.update();
down.update();
}
سپاس گزارم ازشما برای وقتی که برای حل شدن مشکلم گذاشتید.نقل قول:
ببین کدت رو به شکل تابع نویسی در آوردم
اینو آپلود کن ببین همه چیز درسته یا نه
و این که یه نکته تو وقتی از شرط خارج میشی داری به پین دیجیتال متصل به رله دستور high میدی مگه رله تو 1 فعاله ؟
مدل رله ای که استفاده می کنی چیه؟
کد هایی که تغییر دادین رو آپلود کردم و تا اینجای برنامه مثل قبل درست کار میکنه.
درسته رله توی 1 فعال میشه ، پین میکرو به بیس یک ترانزیستور متصل میشه و رله توسط ترانزیستور فعال میشه.
در مورد دستورات شرطی که توی کد قرار داره مطمئنم چون به جای قرار دادن متغیر در کد ؛ از عدد استفاده کردم و دیدم که کارش رو درست داره انجام میده.
در مورد کلید تنظیم که قراره یک بار تنظیمات دما رو بیاره و یک بار تنظیمات رطوبت رو فکر کنم باید از switch / case استفاده کرد درسته؟؟؟؟
بچه ها بالاخره موفق شدم :d :) :d
پس از روز ها و شب ها بیداری خلاصه تونستم با کمک شما و کمک خدا :) و سلام و صلوات و با رمز یا زهرا :) برنامه ای رو که میخواستم درست کنم.
الان که خیلی خسته ام و خوابم میاد فردا یک فیلم از نحوه کار کردش میگیرم و میذارمش اینجا تا بقیه هم ببینند.
سلام
یه فیلم گرفتم از روش کار کردنش:
http://s7.picofile.com/file/82383647...22004.zip.html
کد:#include <EEPROM.h>
#include <Bounce2.h>
#include <DHT.h>
#include <LiquidCrystal.h>
#define setBUTTON 13
#define upBUTTON 12
#define downBUTTON 11
#define DHTPIN 2
#define DHTTYPE DHT21
Bounce set;
Bounce up;
Bounce down;
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8, 7, 6, 5, 4, 3);
const byte temprelay = 10, humidityrelay = 9;
byte humiditySetpoint = 85;
byte tempSetpoint = 20;
unsigned long prevMillis = 0;
unsigned long currentmillis = millis();
static byte prevdownButton;
static byte prevupButton;
static byte prevsetButton;
static byte prevSetMode;
byte setMode;
void setup() {
lcd.begin(16, 2);
lcd.clear();
dht.begin();
set.attach (setBUTTON);
set.interval(30);
up.attach (upBUTTON);
up.interval(30);
down.attach (downBUTTON);
down.interval(30);
pinMode (setBUTTON, INPUT_PULLUP);
pinMode (upBUTTON, INPUT_PULLUP);
pinMode (downBUTTON, INPUT_PULLUP);
humiditySetpoint = EEPROM.read(0);
tempSetpoint = EEPROM.read(1);
}
void loop() {
set.update();
up.update();
down.update();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.clear();
lcd.setCursor(1,0);
lcd.print("Failed to read ");
lcd.setCursor(0,1);
lcd.print("from DHT sensor!");
delay(2000);
lcd.clear();
return;
}
if ((t) >= tempSetpoint){
digitalWrite (temprelay, HIGH);
}
else if ((t) <= tempSetpoint-5)
{
digitalWrite (temprelay, LOW);
}
if ((h) >= humiditySetpoint){
digitalWrite (humidityrelay, LOW);
}
else if ((h) <=humiditySetpoint-10)
{
digitalWrite (humidityrelay, HIGH);
}
if ( setMode != 0) {
if (currentmillis - prevMillis >= 10000UL) {
setMode = 0;
prevMillis = currentmillis;
}
}
if (set.fell()) {
setMode++;
}
prevsetButton = setBUTTON;
if (setMode >= 3) {
setMode = 0;
}
if (setMode != prevSetMode) {
lcd.clear();
prevSetMode = setMode;
}
switch (setMode) {
case 0://normal
lcd.print("Humidity:");
lcd.setCursor(10,0);
lcd.print(h);
lcd.setCursor(15,0);
lcd.print("%");
lcd.setCursor(1,1);
lcd.print("Temp:");
lcd.setCursor(7,1);
lcd.print(t);
lcd.setCursor(12,1);
lcd.print(" *C ");
prevMillis = currentmillis;
break;
case 1://edit temp
if ('upButton' != prevupButton) {
if (up.fell()) {
tempSetpoint = tempSetpoint + 1;
}
prevupButton = 'upButton';
}
if ('downButton' != prevdownButton) {
if (down.fell()) {
tempSetpoint = tempSetpoint - 1;
}
prevdownButton = 'downButton';
}
lcd.setCursor(0, 0);
lcd.print("Set temp:");
lcd.setCursor(7, 1);
lcd.print(tempSetpoint);
lcd.setCursor(9,1);
lcd.print("*C");
EEPROM.write(1, tempSetpoint);
break;
case 2://edit humidity
if ('upButton' != prevupButton) {
if (up.fell()) {
humiditySetpoint = humiditySetpoint + 1;
}
prevupButton = 'upButton';
}
if ('downButton' != prevdownButton) {
if (down.fell()) {
humiditySetpoint = humiditySetpoint - 1;
}
prevdownButton = 'downButton';
}
lcd.setCursor(0, 0);
lcd.print("Set Humidity:");
lcd.setCursor(7, 1);
lcd.print(humiditySetpoint);
lcd.setCursor(9,1);
lcd.print("%");
EEPROM.write(0, humiditySetpoint);
break;
}}