Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
22
Cevap
407
Tıklama
0
Öne Çıkarma
Switch case ile değişkeni joystick ile değiştirilebilir mi?
P
9 yıl
Teğmen
Konu Sahibi

Örnek kod aşağıda:

Örnekte sicaklikdegisken ini tuş ile veya joystick le 25 de 26 ya gibi bi değişim yaptırılabilir mi. bazı videolar da görmüştüm ama nasıl yapılacağını bulamadım çözemedim yardım edermisiniz.

#include <LiquidCrystal.h> 

//*** DEĞİTİRİLECEK
float sicaklikdegisken=26.7;
//***

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int sogutucu;
float gerilim;
int sicaklikpin=1;
int sicaklik;



void setup(){
lcd.begin(16,2);
}


void loop(){
gerilim = analogRead(sicaklikpin);
gerilim = (gerilim/1023)*5000;
sicaklik = gerilim /10,0;

if(sicaklik < sicaklikdegisken){
digitalWrite(sogutucu,LOW);
}else if(sicaklik > sicaklikdegisken){
digitalWrite(sogutucu,HIGH);
}

}
}



DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



P
9 yıl
Teğmen
Konu Sahibi

quote:

Orijinalden alıntı: goçhisar

Buton basma işinde parazit vardır. Basarken yada çekerken işlemciye ardarda basılıp çekiliyormuş gibi gösterir. Bunu engellemek için butonlara ufak kondansatörler bağlar yada kodla bekleme süresi ekleriz. En basit halini pulse in komutu ile verdim. daha detaylısı için millis() komutu ile bekletme işlevi kullanarak bekletilen süre dolunca ikinci basım gerçekleşiyormuş gibi işlemi devam ettirebilirsin. Bas çek şeklinde değilde açık kapalı butonlar ise onlarla menü gezintisi yapılmaz. PushButton tarzında olması menü gezintisi için daha iyidir.

En güzel yöntem ise rotary encoder kullanmak. İmzamdaki sitede bir adet tanıttım oraya bak istersen. Bazı araba teyiplerinde olan, basınca teyibi açan, çevirince sesi yükseltip düşüren sonsuz dönmeye sahip encoderler daha güzeldir.

Menü gezintisi ayarlayabilirsin tabi. Çok zor bir işlem değil. lcd print ile menü oluşturabilirsin. Mesela yukardaki verdiğim kodda sıcaklık artış ve azalmasının ardına lcd print komutu ekleyip değişimi ekrana yazdırabilirsin. 2 adet ayar değiştirme için giriş, 2 adet menü gezintisi için giriş sinyali olması yeterli olur. Menü gezintisi için giriş (onay seçim) ve çıkış olacak. Menü seviye değişkenlerin olacak. Her seviye için menü adları ekrana yazdırılacak.

switch komutu menü için iyi olur. Her münü adına bir kimlik numarası verirsin, menü seviye değişkenlerine kimlik numarasını kaydeder ve yapılması gereken işlem için dallandırmalı seçim yaptırırsın.

Tekrardan özür dilerim . verdiğiniz kod ile yapamadım. ama şu kod ile denedim ama birtürlü olmuyor.artım butona basıyorum sicaklikdegisken degisiyor herşey yolunda bir de düşüreyim diyorum düşmüyor.
ISIS ile şemasını çıkardım. bi bakabilirseniz sevinirim. Rar halinde koydum.

http://s4.dosya.tc/server2/fmwm2u/butonladegiskendegistirme.rar.html

Kod:
 
#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);

const int buton = 6; /*sicaklkdegisken artis*/
const int buton1 = 7; /*sicaklkdegisken azalis*/

const int led = 9;
float sicaklikdegisken = 26.7; /* butona basılma sayısını tutacak değişken */
float nemdegisken = 67.1;
int butonDurumu = 0;
int butonDurumu1 = 0;

void setup() {
pinMode(buton, INPUT);
pinMode(buton1, INPUT);
pinMode(led, OUTPUT);
lcd.begin(16,2);
}

void loop() {
butonDurumu = digitalRead(buton);
if (butonDurumu == HIGH) {
delay(10); /* dalgalanmalar için biraz bekleyelim */
sicaklikdegisken=sicaklikdegisken+0.1; /* sayaç = sayaç + 1 yani sayaç değeri bir arttırıldı */
while(butonDurumu == HIGH){ /* Butona basili olduğu surece bekle */
butonDurumu = digitalRead(buton); /* Butonun durumunu kontrol et */
}
delay(10); /* dalgalanmalar için biraz bekleyelim */
}
butonDurumu1 = digitalRead(buton1);
if (butonDurumu1 == HIGH) {
delay(10); /* dalgalanmalar için biraz bekleyelim */
sicaklikdegisken=sicaklikdegisken-0.1; /* sayaç = sayaç + 1 yani sayaç değeri bir arttırıldı */
while(butonDurumu1 == HIGH){ /* Butona basili olduğu surece bekle */
butonDurumu1 = digitalRead(buton1); /* Butonun durumunu kontrol et */
}
delay(10); /* dalgalanmalar için biraz bekleyelim */
}

lcd.setCursor(0,0);
lcd.print(sicaklikdegisken); /* sayaç değerimizi ekrana yazdırıyoruz */

if(sicaklikdegisken>26.7){
digitalWrite(led,HIGH);
}
if(sicaklikdegisken<26.0){
digitalWrite(led,HIGH);
}
}





< Bu mesaj bu kişi tarafından değiştirildi prax -- 17 Temmuz 2016; 16:15:32 >
Bu mesaja 1 cevap geldi.
P
9 yıl
Teğmen
Konu Sahibi

quote:

Orijinalden alıntı: goçhisar

 
#include <LiquidCrystal.h>

// pin tanımlamaları
#define yukari 6
#define asagi 7
#define _menu 10

//LiquidCrystal(rs, enable, d4, d5, d6, d7)
//LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12,11,5,4,3,2);

#define led 9

// menü seviyeleri tanımlamaları
#define menu_adet 2
#define menu_sicaklik 1
#define menu_nem 2

//buton tepki bekleme süresi
long beklemeSuresi = 200;

//buton süre sayaçları
long sureYukari;
long sureAsagi;
long sureMenu;

//buton tetikleme değişkenleri
bool yukariTetik;
bool asagiTetik;
bool menuTetik;

// menü konum değişkeni, hangi konumda ise onunla ilgili işlem yapacak
int menu = menu_sicaklik; // varsayılan açık menü sıcaklık yani 1

//sıcaklık ve nem değişkenleri
float sicaklik = 29.1;
float nem = 65.7;

//sıcaklik ve nem okuma değişkenleri
int sicaklik_okuma;
int nem_okuma;
int sicaklik_eski = 0;
int nem_eski = 0;

void setup() {
// put your setup code here, to run once:
pinMode(yukari, INPUT);
pinMode(asagi, INPUT);
pinMode(_menu, INPUT);
pinMode(led, OUTPUT);

//lcd başlat
lcd.begin(16,2);
lcd.clear();

// lcd görünüm düzenlemesini yap
// 1. satırı ayar değişkeni için kullanıyorum
lcd.setCursor(0,0);
lcd.print("C:");//yazım alanı 2,0 a kadar kaydı
lcd.print(sicaklik, 1); // sıcaklık 4 karakter değerinde, 6,0 konumundasın
lcd.setCursor(13,0); //ekrana :%R yazısı sığacak kadar sağa kaydırdım
lcd.print(":%R");
lcd.setCursor(9,0);//ekransa nem değerini 4 karakter kaplayacak şekilde konumlandırdım
lcd.print(nem, 1);
lcd.setCursor(6,0);// seçili değişiklik alanı için ok işareti konumu
lcd.print("<=");
//LCD 1. satır içeriği
//0123456789012345
//C:29.1<= 65.7:%R
// 2. satırı aktif sıcaklık ve nem için kullanıyorum
lcd.setCursor(0,1);
lcd.print("C:");
lcd.setCursor(13,1);
lcd.print(":%R");
//LCD 2. satır içeriği
//0123456789012345
//C: :%R
}

void loop() {
// put your main code here, to run repeatedly:
// tuş okumalarını yap
if(digitalRead(yukari) == HIGH){
if((millis() - sureYukari) > beklemeSuresi){
artir();//hangi seçimde ise o seçimin değerini artıracak fonksiyon
sureYukari = millis();//ikinci değişim için süreyi başa al
}
}else{
sureYukari = millis();//yukarı tuş süresi başlangıç değeri
}

if(digitalRead(asagi) == HIGH){
if((millis() - sureAsagi) > beklemeSuresi){
azalt();//hangi seçimde ise o değeri azaltacak fonksiyon
sureAsagi = millis();//ikinci değişim için süreyi başa al
}
}else{
sureAsagi = millis();//aşağı tuş süresi başlangıç değeri
}

if(digitalRead(_menu) == HIGH){
if((millis() - sureMenu)> beklemeSuresi){
menu++;// menüyü artır
if(menu > menu_adet){ menu = 1; }// limit menü sayısına ulaşınca başa dön
sureMenu = millis();//ikinci değişim için süreyi başa al
lcd_menu_oku();// menü oku yönünü değiştir
}
}else{
sureMenu = millis();//menü tuşu süresi başlangıç değeri
}

//analog okuma ve aktif değerleri yazdırma
// sıcaklık değeri okuma
sicaklik_okuma = 0;
for(int i=0; i<3; i++){
sicaklik_okuma = sicaklik_okuma + analogRead(A0);//A0 pinine sıcaklık sensörünü koy
delayMicroseconds(150);
}
sicaklik_okuma = sicaklik_okuma / 3;// okumada oluşacak sapmaları önlemek için 3 kez okut
nem_okuma = 0;
for(int i=0; i<3; i++){
nem_okuma = nem_okuma + analogRead(A1);//A1 pinine nem sensörü bağlanacak
delayMicroseconds(150);
}
nem_okuma = nem_okuma / 3;
if(sicaklik_okuma != sicaklik_eski){
sicaklik_eski = sicaklik_okuma;
lcd_sicaklik();
}
if(nem_okuma != nem_eski){
nem_eski = nem_okuma;
lcd_nem();
}
}

void artir(){
switch(menu){
case menu_sicaklik:
sicaklik = sicaklik + 0.1;
lcd_sicaklik_ayar();
break;
case menu_nem:
nem = nem + 0.1;
lcd_nem_ayar();
break;
}
}

void azalt(){
switch(menu){
case menu_sicaklik:
sicaklik = sicaklik - 0.1;
lcd_sicaklik_ayar();
break;
case menu_nem:
nem = nem - 0.1;
lcd_nem_ayar();
break;
}
}

void lcd_menu_oku(){
lcd.setCursor(6,0);
switch(menu){
case menu_sicaklik:
lcd.print("<= ");
break;
case menu_nem:
lcd.print(" =>");
break;
}
}

void lcd_sicaklik_ayar(){
lcd.setCursor(2, 0);
lcd.print(" ");
lcd.setCursor(2, 0);
lcd.print(sicaklik, 1);
}

void lcd_nem_ayar(){
lcd.setCursor(9,0);
lcd.print(" ");
lcd.setCursor(9,0);
lcd.print(nem, 1);
}

void lcd_sicaklik(){
float deger = sicaklik_eski / 1023 * 5000 / 10;
lcd.setCursor(2, 1);
lcd.print(" ");
lcd.setCursor(2, 1);
lcd.print(deger, 1);
}

void lcd_nem(){
float deger = nem_eski / 1023 * 5000 / 10;
lcd.setCursor(9,0);
lcd.print(" ");
lcd.setCursor(9,0);
lcd.print(deger, 1);
}


teşekkürler fakat değişkenler butona bastığımda yükseliyor.

youtuba video koydum.

https://youtu.be/evZDUkKBa1A


Bu mesaja 1 cevap geldi.
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.