السلام عليكم ورحمة الله وبركاته
اخوتي اعضاء المنتدى, لم اعلم اين اكتب طلبي هذا فكتبته هنا لانني استخدم لغة C
مشروع التخرج هو عباره عن بناء قفص للدجاج, ويتكون من مسكن للدجاج, و ساحه لاطعامهم... وبين السكن والساعه يوجد باب ويجب ان يفتح الباب في الصباح ويقفل في المساء.. ويوجد مثل الصحنان للدجاج في الساحه. صحن للاكل, وصحن للشرب.. هذه البدايه للمشروع علما باني قمت ببناء الهاردوير للمشروع ولكني فشلت في البرمجه.. (لاني اواجه صعوبه بها)
تفاصيل المشروع
المايكروكنترولر المستخدم هو PIC 16F877 40pins
قمت باستخدام Array Detector لقراءة العدد الذي يتعدى الباب كل يوم, وذلك لانني كنت افكر ان استخدم GSM Modulation لارسال رسائل للمالك واخباره بالتحديث اليومي.
وقمت باختيار الموتور للباب وهو DC motor driven by H-bridge, والذي يفتح ويغلق بحسب الاوامر المرسله من الـ PCF8583 وهو لقراءة اليوم والتاريخ وفي الصباح يفتح الباب والمساء يغلق..
http://www.nxp.com/documents/data_sheet/PCF8583.pdf .
وقمت باختاير Float switch لقياس الماء المخزن, وفكرت في استخدام Solinoid Valve لفتح صنبور الماء واغلاقه.. مثال, اذا كان المخزون اقل بنسبة 30% فان الصنبور يفتح ليملئ المخزون بالماء..
واستخدمت ايضا Ultrasonic Sensore لقياس مستوى الاكل في المخزن, واذا كان المستوى اقل بنسبة 30% يفتح الجهاز ليملئ الصحن بالاكل. والموتور المستخدم هو نفس الموتور المستخدم للباب.
http://www.maxbotix.com/documents/MB1010_Datasheet.pdf
تمت البرمجه على برنامج MPLAB IDE مع CCS COMPILER
ارجوا من ذوي الخبره مساعدتي في المشروع واخباري بالاخطاء.. :sad: علما بانه لم يتبقى وقت لتسليم المشروع
اشكركم جزيل الشكر
وهذا اقتباس من الكود
اقتباس#include <16f877.h>
#device ADC=10 //
// ayarlar
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use I2C(master, sda=PIN_B0, scl=PIN_B1)
#use I2C(slave,sda=PIN_C4,scl=PIN_C3 ,address=0xa0,FORCE_HW)
#use I2C(master, scl=PIN_B0, sda=PIN_B1, fast=450000)
//sets the target speed to 450 KBSP
#define use_portb_lcd TRUE // LCD B
#define buton_ileri pin_c4
#define buton_geri pin_c5
signed int8 ADIM=0;
int16 Vref,Vcikis;
float filtre,counter,door_counter,day,second,hour,minute,water_level,timer_1,timer_2,door_time,food_1,data;
float chicken_counter_1,chicken_counter_2,array_1,array_2;
unsigned int8 sayac;
char durum;
#int_timer1 // Timer1
void timer1_kesme ()
{
door_counter=door_counter+1;
//When the water level is low, run water tap motor for 1 ms
if (water_level<0.3)
{
timer_1=timer_1+10e-6;
if (timer_1>0.001)
{
timer_1=0;
output_low(PIN_C0);
output_low(PIN_C1);
}
}
//Data from Ultrasonic detector
//Data is reading from analog output of ultrasonic sensor
//When the food level is low, run food motor for 1 ms
if (food_1>0.5)
{
timer_2=timer_2+10e-6;
if (timer_2>0.001)
{
timer_2=0;
output_low(PIN_C1);
}
}
//When time is the one which is opening door, open door
if (door_counter>door_time)
{
output_high(PIN_C2);
}
//Detection array1
if ( input(PIN_A3)==1 )
{
delay_ms(1500);
chicken_counter_1= chicken_counter_1+1;
}
//Detection array2
if ( input(PIN_A5)==1 )
{
delay_ms(1500);
chicken_counter_2= chicken_counter_2+1;
}
//day counter
counter=counter+1;
if ((counter*100e-6) >1)
{
counter=0;
second=second+1;
}
if (second>60)
{
second=0;
minute=minute+1;
}
if (minute>60)
{
minute=0;
hour=hour+1;
}
if (hour>24)
{
hour=0;
day=day+1;
}
//solar detection and open the door
i2c_start();
data=i2c_read(0); // Now read
i2c_stop();
//At nigth close the door
if ((hour>18) && (data<0.1))
{
output_low(PIN_C2);
}
set_timer1(63036);
}
void main ( )
{
SET_TRIS_C( 0x78 );
SET_TRIS_A( 0x30 );
second=0;
minute=0;
hour=0;
day=0;
timer_1=0;
timer_2=0;
door_counter=0;
chicken_counter_1=0;
chicken_counter_2=0;
counter=0;
door_time=36000;
//Initial delay
delay_ms(10);
delay_ms(1500);
setup_psp(PSP_DISABLED); // PSP is OFF
setup_spi(SPI_SS_DISABLED); // SPI is OFF
//setup_timer_1(T1_DISABLED); // T1 timer is off
setup_timer_2(T2_DISABLED,0,1); // T2 timer is off
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
set_timer1(63036);
//Inýtialize and set A/D converter
setup_adc_ports( ALL_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel(2);
setup_CCP1(CCP_OFF); // CCP1 is OFF
setup_CCP2(CCP_OFF); // CCP2 is OFF
output_d(0x00);
enable_interrupts(INT_timer1); // int_timer1
enable_interrupts(GLOBAL); //
delay_ms(5);
while(1)
{
//Set up A/D converters
set_adc_channel(0);
set_adc_channel(3);
set_adc_channel(4);
water_level = read_adc(0);
food_1= read_adc(3);
if (water_level<0.3)
{
output_low(PIN_B0);
}
}
}