كود أردوينو كامل للتحكم الذكي في مستودع
هيدروبونيك زراعة أسماك نباتات الجزء الثالث (3)
(شرح الكود / شرح لقسم void setup)
Arduino-code-farme-hydroponic-control
===========
كود أردوينو كامل للتحكم الذكي في مستودع هيدروبونيك (زراعة أسماك نباتات او ورقيات...) بالكامل مجرب لن تحتاج لأيدي عاملة به تقريبا إلا للأعمال الروتينية والتفقدات... ونظرا لأن الموضوع طويل فقد تم تقسيمه لسبعة أجزاء وهذا هو الجزء الثالث سنتعرف فيه على شرح لقسم void setup من بقية الأكواد...
الكود مع الشرح (شرح قسم Void setup)
===========================================
void setup() {
هنا نعرف مدخل ومخرج الالتراسونيك والمسافة الاولية التي
سيعرضها كي لاتبقى خانته فارغة
//الالترا
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
distance = 444;
هنا تعريف لزر
التشغيل كي يضيء دائما عند التشغيل وبعده زرر الويفي ليعرض وجود اتصال
//الOn و ال Wifi
pinMode(On, OUTPUT);
pinMode(Wifi, OUTPUT);
هنا نعطي قيمة لتشغيل لاد عمل الجهاز ونطفئ لاد الويفيي
لنعرف حالته فيما بعد
digitalWrite(On, HIGH);
digitalWrite(Wifi, LOW);
هنا نعرف مجموعة
البينات بالاعلى انها مداخل والاخرى مخارج مع اطفائها جميعا
for(int k=0; k<13; k++)
{pinMode(sensor[k], INPUT);}
for(int i=0; i<20; i++)
{pinMode(sortee[i], OUTPUT);}
for(int j=0; j<20; j++)
{digitalWrite(sortee[j], LOW);}
عندنا اذا مجموع البينات الكلي المستعمل بالاردوينو ميغا هي
70 نفس العدد المتوفر...
//13 مدخل +1الترا +3ريموت المجموع 17
//20 مخرج + 1 الترا المجموع 21
//وعندنا 6 6 LCD اي 12
//وعندنا للكايباد 8
//الايثرنت 8
//ال RTC هي 2
//المجموع 68
//ونعلم ان 54 ديجيتال + 16 اناوجيك = 70
//يتبقى A3 لل On و A4 لل Wifi
تشغيل الrtc و السيريال والشاشتين والايثرنت شيلد وطباعة بالسسيريال void….
و demarage… لنعرف أن النظام بدأ يشتغل...
rtc.begin();
Serial.begin(9600);
Serial.println("Void Setup..............................");
Serial.println("Demarage de Systeme…");
lcd1.begin(20, 4);
lcd2.begin(20, 4);
//هذا لتشغيل حالة ال Wifi تقدر تنزعهم
Ethernet.begin(mac, ip);
هنا إظهار صوتي وباللاد بلوحة العرض أن النظام بدأ...
//رسائل البدأ
tone(Z, 3000, 20);
digitalWrite(On, LOW);
delay (150);
tone(Z, 3000, 20);
digitalWrite(On, HIGH);
delay (400);
دوال لكتابات ثابتة سنحتاجها عند التغيير من وضع أوتو إلى
مانيال إلى وضع التحليل..الخ لأن الكتابات الثابتة ستمسح ولابد من إعادتها لمكانها
عند كل تغيير بالوضع العام...
#define B1 lcd2.setCursor(0, 0)
#define B2 lcd2.print("=")
#define B3 lcd2.setCursor(0, 2)
#define B4 lcd2.print("F<")
#define B5 lcd2.setCursor(3, 2)
#define B6 lcd2.print("M<")
#define B7 lcd2.setCursor(6, 2)
#define B8 lcd2.print("Q<")
#define B9 lcd2.setCursor(9, 2)
#define B10 lcd2.print("R1<")
#define B11 lcd2.setCursor(13, 2)
#define B12 lcd2.print("R2<")
#define B13 lcd2.setCursor(17, 2)
#define B14 lcd2.print("R3<")
#define B17 lcd2.setCursor(3, 3)
#define B18 lcd2.print("W<")
#define B19 lcd2.createChar(1, Flesh1)
#define B20 lcd2.setCursor(6, 3)
#define B21 lcd2.write(byte(1))
#define B22 lcd2.setCursor(19,1)
#define B23 lcd2.print("K")
#define B24 lcd1.setCursor(0, 2)
#define B25 lcd1.print("Li<")
#define B26 lcd1.setCursor(4, 2)
#define B27 lcd1.print("Lx<")
#define B28 lcd1.setCursor(8, 2)
#define B29 lcd1.print("Lm<")
#define B30 lcd1.setCursor(12, 2)
#define B31 lcd1.print("Fd<")
#define B32 lcd1.setCursor(16, 2)
#define B33 lcd1.print("Wt<")
#define B34 lcd1.setCursor(0, 3)
#define B35 lcd1.print("Vn<")
#define B36 lcd1.setCursor(4, 3)
#define B37 lcd1.print("Fn<")
#define B38 lcd1.setCursor(8, 3)
#define B39 lcd1.print("Ch<")
#define B40 lcd1.setCursor(12, 3)
#define B41 lcd1.print("An<")
#define B42 lcd1.setCursor(16, 3)
#define B43 lcd1.print("Ox<")
//كتابات ثابتة عامة
B1; B2; B3; B4; B5; B6; B7; B8; B9;
B10; B11; B12; B13; B14;
B17; B18; B19; B20; B21; B22; B23;
B24; B25; B26; B27; B28;
B29; B30; B31; B32; B33; B34; B35;
B36; B37; B38; B39; B40; B41;
B42; B43;
تشغيل لاد الوضع الأوتوماتيكي
والبقاء فيه اذا كان السويتش في الوضع الاوتوماتيكي...
if (digitalRead(B_auto) == HIGH){
digitalWrite(Led_auto, HIGH);
Serial.println("At...");
قراءات أولية لمختلف الحساسات لعرضها بالشاشات لأننا نعلم
أننا وضعنا بالأسفل زمن تأخير لكل منها وإذا لم نضفها هنا فلن تظهر الشاشات أي
قرائة إلى بعد مرور مدة التأخير المتمثلة مثلا في الحرارات والرطوبة والغاز في 30
ثانية وفي حساس الضوء 1ساعة وهذه مشكلة حلها هنا...
//قرائة
اولية لحساس الضوء
D = analogRead(sensorPin_D);
lcd2.setCursor(16, 0);
lcd2.print("D ");
lcd2.setCursor(17, 0);
lcd2.print(D);
//قرائة
اولية لحساسات الغاز
Gs = (analogRead(sensorPin_Gs));
Gs = map(Gs, 0, 1023, 0, 255);
lcd2.setCursor(9, 1);
lcd2.print("Gs ");
lcd2.setCursor(11, 1);
lcd2.print(Gs);
Gi = (analogRead(sensorPin_Gi));
Gi = map(Gi, 0, 1023, 0, 255);
lcd2.setCursor(4, 1);
lcd2.print("Gi ");
lcd2.setCursor(6, 1);
lcd2.print(Gi);
//قرائة
اولية لحرارة ورطوبة الداخل
int readData_i = DHTi.read11(sensorPin_Ti);
float Ti = DHTi.temperature;
float Hi = DHTi.humidity;
lcd1.setCursor(0, 1);
lcd1.print("i");
lcd1.print(Ti, 0);
lcd1.setCursor(3, 1);
lcd1.print("( )");
lcd1.setCursor(4, 1);
lcd1.print(Hi, 0);
//قرائة
اولية لحرارة ورطوبة الخارج
int readData_x = DHTx.read11(sensorPin_Tx);
float Tx = DHTx.temperature;
float Hx = DHTx.humidity;
lcd1.setCursor(8, 1);
lcd1.print("x");
lcd1.print(Tx, 0);
lcd1.setCursor(11, 1);
lcd1.print("( )");
lcd1.setCursor(12, 1);
lcd1.print(Hx, 0);
//قرائة
أولية لحساس حرارة الماء Te
Vo = analogRead(sensorPin_Te);
RR2 = RR1 * (1023.0 / (float)Vo - 1.0);
logRR2 = log(RR2);
TT = (1.0 / (c1 + c2 * logRR2 + c3 * logRR2 * logRR2 * logRR2));
Te = TT - 273.15;
lcd1.setCursor(16, 1);
lcd1.print("e");
lcd1.setCursor(17, 1);
lcd1.print(Te, 0);
//قرائة
اولية للحرارة للعلبة الكهربائية
int readData_s = DHTs.read11(sensorPin_Ts);
float Ts = DHTs.temperature;
float Hs = DHTs.humidity;
lcd2.setCursor(0, 1); // Sets the location at which subsequent text
written to the LCD will be displayed
lcd2.print("s"); // Prints string "Temp." on the LCD
lcd2.print(Ts, 0);
//قرائة
أولية لحساس الناقلية
C = analogRead(sensor_pin_c);
C = map(C, 670, 1023, 0, 10);
C = constrain(C, 0, 10); //هذا لتثبيت النطاق
//ناقلية
الماء 660تقريبا اي عدد يظهر هو تلوث فوق هذا العدد
lcd2.setCursor(8, 0);
lcd2.print("C ");
lcd2.setCursor(9, 0);
lcd2.print(C);
//قرائة
اولية لحساس مستوى الماء
L = analogRead(sensorPin_L);
L = map(L, 0, 1023, 0, 10);
L = constrain(L, 0, 10);
lcd2.setCursor(4, 0);
lcd2.print("L ");
lcd2.setCursor(5, 0);
lcd2.print(L);
//قرائة
اولية للالترا
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
if (distance < 1000) {
lcd2.setCursor(14, 1);
lcd2.print("U ");
lcd2.setCursor(15, 1);
lcd2.print(distance);}
else {
lcd2.setCursor(14, 1);
lcd2.print("U ");
lcd2.setCursor(15, 1);
lcd2.print("999");}
//قرائة
اولية للفلوتور T1 T0
if (digitalRead(B_Wt) == HIGH) {
lcd2.setCursor(1, 0);
lcd2.print("T1");}
else {
lcd2.setCursor(1, 0);
lcd2.print("T0");}
//قرائة
اولية للPH غير
موجود
P=7;
lcd2.setCursor(12, 0);
lcd2.print("P ");
lcd2.setCursor(13, 0);
lcd2.print(P);
//كتابات ثابتة خاصة بالاوتو فقط
//No
think....
lcd2.setCursor(7, 3);
lcd2.print(" start auto..");
lcd2.setCursor(0, 3);
lcd2.print("At");
//الريموت XY 2
RemoteXY_Init ();
pinMode (PIN_SWITCH_1, OUTPUT);
pinMode (PIN_SWITCH_10, OUTPUT);
pinMode (PIN_SWITCH_2, OUTPUT);
pinMode (PIN_SWITCH_3, OUTPUT);}
تشغيل لاد الوضع اليدوي
والبقاء فيه اذا كان السويتش في الوضع اليدوي...
else if (digitalRead(B_mn) == HIGH) {
Serial.println("Mn .........");
Serial.println("Press (Key).");}
//هذا عند تخطي الريموت
digitalWrite(On, LOW);
delay (150);
digitalWrite(On, HIGH);
delay (150);
digitalWrite(On, LOW);
delay (150);
digitalWrite(On, HIGH);
delay (150);
//هذا لتشغيل حالة ال Wifi تقدر تنزعهم
if (client.connect(Site, 80)) {
digitalWrite(Wifi, HIGH);}
else {digitalWrite(Wifi, LOW);}
//هذا عند تخطي حالة الويفي اتصال
digitalWrite(On, LOW);
delay (150);
digitalWrite(On, HIGH);
delay (150);
digitalWrite(On, LOW);
delay (150);
digitalWrite(On, HIGH);
delay (150);
}
===========================================
للتنقل السريع بين أجزاء الموضوع إستخدم الروابط بالأسفل...
إذا أعجبك الموضوع يمكنك مشاهدة مواضيع مشابهة بقسم الأردوينو لاتقل أهمية إضغط هنا للإنتقال لقسم الأردوينو.
ليصلك جديدنا تابعنا على صفحاتنا الاجتماعية: الفيسبوك, التويتر ,tumblr, pinterest, linkedin, instagram