MasAAka
Hectopat
- Katılım
- 5 Ocak 2021
- Mesajlar
- 25
Daha fazla
- Sistem Özellikleri
- AMD RYZEN 5 5600H
RTX 3050 4GB
16GB RAM
- Cinsiyet
- Erkek
Final ödevi için kodunu ArduinoIDE üzerinden hazırladığımız Dolum Sensörlü Akıllı Çöp Kovası projesinde hocamızın isteği üzerine MatLab üzerinden Guide yapmamız gerekiyor. Yaptık lakin aşağıdaki hatayı alıyoruz.
Konsol:
Matlab Guide Kodu
ArduinoIDE Kodu
Lazım olur ise dosya halinde gösterebiliriz.
Konsol:
Matlab Guide Kodu
function varargout = SENSOR(varargin) %Burası matlab gui arayüzü oluşturulduğunda
%otomatik olarak eklenen kısım
%Burda matlab gui ile alakalı ayarlar
%yapılıyor.
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @SENSOR_OpeningFcn, ...
'gui_OutputFcn', @SENSOR_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function SENSOR_OpeningFcn(hObject, eventdata, handles, varargin)
%Bu kısım bizim matlab script-file dosyası çalıştırıldığında
%çalıştırılacak kodların bulunduğu kısım.
cla(handles.axes1);
guidata(hObject, handles);
handles.output = hObject;
guidata(hObject, handles);
function varargout = SENSOR_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function INICIO_Callback(hObject, eventdata, handles)
%Burası bizim Ölçümü Başlat Butonuna bastıgımızda
%işletilecek komutların oldugu kısım.
%Kodların tamamına yakını burada yazılı.
%Gui arayüzüne mesafeyi yazdırma, grafik çizme vs.
set(handles.STOP,'UserData',0); %Ölçümü durdur butonuna basılı değil olarak başlanıyor.
SerPIC = serialport('COM8', 9600); %Arduinonun bağlı oldugu port belirleniyor.
set(SerPIC,'BaudRate',9600); %Haberleşme hızı 9600 olarak ayarlanıyor.
set(SerPIC,'DataBits',8);
set(SerPIC,'Parity','none');
set(SerPIC,'StopBits',1);
set(SerPIC,'FlowControl','none');
fopen(SerPIC); %Port haberleşmeye açılıyor.
global x; %x adında bir değişken tanımlanıyor.
x=0; %x değişkenine ilk değeri sıfır olarak atanıyor.
try
while (1)
if get(handles.STOP,'UserData')==1
%Eğer ölçümü durdur butonuna basılırsa döngüden
%çıkılıyor.
break
end
a = fscanf(SerPIC, '%f');
set(handles.edit1,'string',[num2str(a)]); %a değişkenindeki veri gui ekranına yazdırılıyor.
x=x+1; %Zaman ekseninin sürekliliği için.Döngü çalıştıkça zaman ekseni
%1 sn aralıklarla artacak.
y(x)=fscanf(SerPIC,'%d'); %Seri porttan okunan veriler zamana bağlı bir fonk. tutuluyor.
drawnow; %Gerçek zamanlı grafik çizdirmek için gerekli komut.
axes(handles.axes1); %Grafiğin çizileceği bileşen seçiliyor.
plot(y,'r','linewidth',5) %Sürekli zamanlı sinyal çizdiriliyor.
title('Zaman-Mesafe Grafiği'); %Grafiğin başlıgı ayarlanıyor.
xlabel('Zaman (sn)'); %Grafiğin x ekseninde yazacak yazı belirleniyor.
ylabel('Mesafe (cm)'); %Grafiğin y ekseninde yazacak yazı belirleniyor.
ylim([0 90]) %y ekseninin aralığı 0-100 arası seçiliyor.
if (a>=16) %Mesafe 5 cm den küçükse ÇOK YAKIN yazdırılıyor.
set(handles.distancia,'string','Boş')
else
if ((a<16) & (a >= 12)) %Mesafe 30 cm den büyükse 'ÇOK UZAK' yazdırılıyor.
set(handles.distancia,'string','%25 Dolu')
else
if ((a<12) & (a >= 8)) %Mesafe 20 ile 30 arasında ise UZAK yazdırılıyor.
set(handles.distancia,'string','%50 Dolu')
else
if (a < 8) & (a >= 4) %Mesafe 10 ile 20 cm arasında ise ORTA yazdırılıyor.
set(handles.distancia,'string','%75 Dolu')
else
if ((a < 4) & (a>=0)) %Mesafe 5 ile 10 cm arasında ise YAKIN yazdırılıyor.
set(handles.distancia,'string','%100 Dolu')
else
end
end
end
end
end
drawnow
end
catch
errordlg('Bir Hata Oldu !! ','Hata')
end
clear SerPIC
function STOP_Callback(hObject, eventdata, handles)
set(handles.STOP,'UserData',1)
set(handles.edit1,'string',0);
cla(handles.axes1);
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function distancia_CreateFcn(hObject, eventdata, handles)
ArduinoIDE Kodu
C:
#include <LiquidCrystal.h> //Load Liquid Crystal Library
LiquidCrystal LCD(11,10,5,4,3,2); //Create Liquid Crystal Object called LCD
#include <Servo.h> //servo kütüphanesi
#define trigPin 13 //Sensörün Echo pini Arduinonun 13. pinine bağlanır
#define echoPin 12 //Sensorün Trig pini Arduinonun 12. pinine bağlanır
#include <Arduino.h>
Servo servo;
int triggerPin = 8;
int echooPin = 7;
int servoPin = 9;
long zaman;
int mesafe ;
void setup()
{
servo.attach(servoPin);
servo.write(0);
delay(2000);
// trigger pinini output olarak seçiyoruz
pinMode(triggerPin, OUTPUT);
// echoo pinini input olarak seçiyoruz
pinMode(echooPin, INPUT);
//serial iletişimi başlatıyoruz
Serial.begin (9600);
pinMode(trigPin, OUTPUT); //13. yani trigpini çıkış olarak ayarlıyoruz
pinMode(echoPin, INPUT); //12. yani echoPini giriş olarak ayarlıyoruz
LCD.begin(16,2); //Arduinoya lcdyi çalıştırmasını söylüyoruz
LCD.setCursor(0,0); //Kursörü ilk satırın ilk sütununa getirmesini söylüyoruz
LCD.print("Cop Kovasi"); //İlk satırda görünecek mesajı yazıyoruz
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1; // Sesin gidiş gelişinde ölçülen süreyi önce ikiye bölerek sadece gidiş hızını ölçüyor,
// Sonra da ses hızına bölerek mesafeyi buluyoruz.
if ( distance>20)
{
delayMicroseconds(3);
Serial.println(0);
LCD.setCursor(0,1);
LCD.print("- Cop Kovasi Bos -");
LCD.print(" ");
delay(500);
}
else if (16<distance )
{
delayMicroseconds(3);
Serial.println(25);
LCD.setCursor(0,1);
LCD.print("- %25 Dolu -");
LCD.print(" ");
delay(500);
}
else if (12<distance ) // Gelen mesafe uzak ise
{
delayMicroseconds(3);
Serial.println(50);
LCD.setCursor(0,1);
LCD.print("- %50 Dolu -");
LCD.print(" ");
delay(500);
}
else if (8<distance ) // Gelen mesafe uzak ise
{
delayMicroseconds(3);
Serial.println(75);
LCD.setCursor(0,1);
LCD.print("- %75 Dolu -");
LCD.print(" ");
delay(500);
}
else if (4<distance )
{
delayMicroseconds(3);
Serial.println(100);
LCD.setCursor(0,1);
LCD.print("- %100 Dolu -");
LCD.print(" ");
delay(500);
}
// Trigger pini 0 Volt olarak ayarlıyoruz.
digitalWrite(triggerPin, LOW);
delayMicroseconds(2); // Trigger pinini 10 saniye için high olarak ayarlıyoruz ve 5 V gerilim uyguluyoruz.
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
// echooPini okur ve ses dalgası mikrosaniye olarak döndürür.
zaman= pulseIn(echooPin, HIGH);
// Mesafe hesaplaması
mesafe = zaman* 0.034 / 2;
//bundan sonraki iki satır HC-SR04 mesafe sensörünün, anlık olarak yaptığı mesafe ölçümlerinin sonucunu görmemizi sağlar.
Serial.print("Mesafe: ");
Serial.println(mesafe);
if ( mesafe <= 15 ){ // mesafe 50 altında ise servo 135 dereceye geliyor.
servo.write(100);
delay(3000); // Delay süreleri opsiyoneldir, değiştirilebilir.
}else{ // değil ise kendine 45 dereceye getiriyor.
servo.write(0);
}
}
Lazım olur ise dosya halinde gösterebiliriz.
Son düzenleyen: Moderatör: