Python döngü dışında döngüden çıkmak

Arkadaşlar merhaba rapberryle arduino yu birleştirip arduinodan aldığım sıcaklık değerine göre klima açıp kapatmak ve aynı zamanda bunları telefondan kontrol etmek istiyorum
Kodlama olarak çoğunu yaptım ama arduino dan veri çekerken kullandığım while true koduna gelince işlem döngüye giriyor ve telefondan kontrolu kaybediyorum. Break komutunu kullanınca da herhangi bir değer vermiş ve telefondan kontrol etmemiş oluyorum yapmak istediğim while döngüsünü döngüye gelmeden istediğim zaman çıkmak bunu nasıl yapabilirim

Soruda çok boşluk var. Kod da yok.

Sınırlamalar: Arduino, Telefon, klima açıp kapatmak.

Anlamadıklarım:

Döngünün içinde ne yapıyor kod?

Sonuçta zaten arduino da loop döngüsünün içinde dönüyor.

Rapbery ne? Raspberry’yi yanlışlıkla yazmış olabilirsin de bu donanımın rolü ve yeri ne?

Arduinodan veri çekmek ne demek?

Hangi iletişim protokolünü kullanıyorsun?

I2C, serial, uart, SPI?

Telefona doğrudan bağlayamayacağına göre.

Ya wifi yada bluetooth modülü kullanman gerekiyor. Bundan hiç bahsetmemişsin.

Yani kodlar ve tasarımın hakkında hiç bir bilgi yok.

Dahası klimayı nasıl kontrol edeceksin.

IR led ile kumanda ederek mi? Yoksa kontaktör yada röle kullanarak sadece enerji vermek suretiyle mi? Yoksa Klimanın bluetooth yada wifi arayüzü mü var bilemiyorum.

Hele döngüye gelmeden istediğim zaman çıkmak ne demek hiç anlamadım.

Bu kadar şeyi neden yazdım. Her tasarımın kendine göre çözümleri var. Ama senin aradığın çözüm çözüm değil.

Yani bunu nasıl yapabilirim derken ben şöyle sorardım. Tasarımımı kullandığım donanımı ve kodlarımı paylaştıktan sonra tabi ki:

Bu donanımla ısı bilgisi, telefondan gelen komutlar ve klima açma kapama işlemlerini nasıl kontrol edebilirim.

While döngüsüne odaklanıp sorarsan çözemediğin konuyu çözümsüzlüğe yönlendirerek soruya cevap verecekleri de çözümsüzlüğe sürüklersin.

Sorun while döngünde değil.

Bu süreci hangi kısımda yöneteceğinde.

Server Telefon olursa çözüm farklı, server arduino olursa çözüm farklı olur.

Tahminim, döngü ile ısı verisi iletmeye çalışıyorsun, iletim olduğu sürece de başka işlem yapamıyorsun.

Ama neden sürekli ısı verisi alıyorum, belirli periyotlarla server arduino olsa istemci olarak (client) bağlanıp alıp sonra bağlantıyı kessem diye düşünmüyorsun.

Yada tersi, server telefon belirli periyotla arduino bağlanıp bir değer gönderip bağlantıyı kesse de diyebilirsin.

Aslında daha ileri seviye çözümler var interrupt ve watchdog gibi ama while döngüsünde takılan birine öneremem. Elektronik bilgisi gerektirir, mikrokontrolör programlama deneyimi gerektirir.

En azında Arduino ide yerine, Microchip Studio kullanmış olman gerekir ki bu konuya zaman ayırdığını düşünmüyorum.

Özetlersek, detaylı bilgi vermediğin için nokta atış çözüm bulamayız.

Ama diğer bilgiler üzerinde detay verebilirsen.

Haberleşme zamanını kontrol altında tutup belirli periyotla alırsan daha kolay olur.

Aslında multitasking konusu bu. Microcontroller çoğunla multi tasking kullanılmaz.

Ben olsam:

Tasarımı şöyle yapardım ( Ki bunun bir bitirme projesi olduğunu varsayıyorum)

Donanımı basitleştiridim.

Elektrikle uğraşmayı sevmem. Klimayı açmak kapamak için.

Önce klima kumandasını arduino ya tanıtırdım.

Çok basit, bir IR alıcı, üzerinde kumanda düğmelerine basıp, gelen dataları kaydediyorsun.

Elde ettiğin verileri Ir verici üzerinden istediğin zaman kumandaya gönderebilirsin. Sıfır elektrik bağlantısı, sıfır kontaktör sıfır röle.

Telefon ile bağlantını, bluetooh veya wife üzerinde seçmelisin.

Ben olsam wifi seçerdim.

Bu şekilde farklı odalardan arduino ile haberleşebilirsin.

Son olarak aldığın sensör bilgisini arduino main loop üzerinde alır.

Arduino main loop üzerinde timer ile belli periyotlarla haberleşme yada komut alma yapardım.

3 Beğeni

Öncelikle uzun cevabınız için teşekkür ederim.
Tahminiz doğru bitirme tezi bu yapmaya çalıştığım lakin üniversitede ki ilk senem bir tanıdığım için ve kendimi geliştirmek amaçlı yapıyorum. Çok fazla bilgi eksiğim var onun için dediklerinizin çoğu hakkında ayrıntı verecek bilgim yok. Yapmak istediğim tam olarak raspberry üzerinden server açıp telefonla raspberry pinlerine bağladığım ledleri ve röle yardımıyla klimayı kontrol etmekti. Ve bunu aslında yapmıştım.

Fakat ben daha önce arduino ile yapmış olduğum yangın sensörü projemi bu projeye dahil ederek biraz kendimi zorlamak ve öğrenmek istedim.

Haberleşme olarak ne denir bilmiyorum ama raspberrynin usb çıkışlarına bağladım arduinoyu.

Derslerde şu ana kadar sadece matlab ve c# gördüğüm için python yazarken biraz da bu zorladı beni.

Arduino da bağladığım lm35 üzerinden aldığım ısı değerlerini raspberrye çekip röle yardımıyla açıp kapadığım klimaya ayrıca ısı değerine göre otomatik açılıp kapanmasını yapmak istemiştim.

İnternetten bulduğum bir kaç bilgi ve kodda bu ısı değerlerini while döngüsüyle alabileceğimi gördüm. Bunu kodlara eklediğimde döngüye girdikten sonra server ile olan bağlantım kopuyordu ve bu döngüden mantıklı bir yolla çıkamadım.

Çok fazla eksik bilgiye rağmen zaman ayırıp cevap verdiğiniz için teşekkür ederim.

1 Beğeni

Aslında uzunca bir tavsiye ve kendi çizdiğim şema çizimlerim vardı.

Şimdi yaptım deyince çok da uzatmaya gerek yok.

Bildiğiniz yoldan devam edim madem.

Bu durumda UART üzerinde serial haberleşeceksiniz.

Arduino içinde while döngüsü kullanmanıza gerek yok. Python tarafında ise farklı bir yol önereceğim.

Arduino ile LM35 Sıcaklık Sensörü Kullanımı-LM35 Uygulaması (arduinomedia.com)

Standart bir uygulama.

int lm35 = A5;
int okunanVoltaj;
float sicaklik;
 
void setup(){
analogReference(INTERNAL);
Serial.begin(9600);
}
 
void loop(){
  okunanVoltaj = analogRead(lm35);
  sicaklik = okunanVoltaj / 9.31; 
  Serial.print("Sıcaklık: ");
  Serial.println(sicaklik);
  delay(1000);
}

loop zaten 1 er saniye bekleyerek seri porttan sıcaklık değerini gönderiyor.

Muhtemelen siz de böyle bir kod kullandınız.

Burada bir while döngüsü yok.

Aslında C# ile de yapabilirsiniz, sonuçta com portu seçip, baud hızını ayarlarsanız, gelen veriyi alırsınız. Ama python madem pyhon’dan devam edelim.

Burada aslında yapılması gereken basit. Komutları çalıştıran ve seri haberleşmeyi dinleyen iki threat oluşturmanız lazım. Bu python a özgü değil, multi process, multi threat uygulamalar C# için de geçerli. Eş zamanlı olarak bir döngü komutları takip ederken diğeri seri haberleşme ile gelen verileri işler. Suçu python bilmemeye atmayalım yani.

Ama nedense multi threat uygulamalara çok yabancı programcılar. Windows gibi aynı anda çok işlemi yapan bir işletim sistemi kullanıp bu nasıl olabiliyor diye kafa yormadan programlama öğrenmek de çok enteresan, ona keza linux türevleri de zaten multitask çalışıyor.

Şimdi buraları geçtik uzun madem.

Yapılacak en kola şey, başta belirttiğim gibi, python ile arduino yu belilri periyotlarla bağlayıp bilgiyi aldıktan sonra bağlantıyı kapatmak. Bu 1 sn de bir de olabilir 5 sn de bir de olabilir sıcaklık değerinin 5 sn de değişmiş olması da iklimlendirmede çok anlamlı değil. Sonuçta su kaynatmıyoruz. Oda sıcaklığı ne kadar hızlı değişebilir ki?

Hatta dakikada 1 veya 10 dk da bir dahi kulanılabilir.

Bu durumda seri haberleşme kodunuzu bir timer a bağlayıp:

Python Timer Functions: Three Ways to Monitor Your Code – Real Python

Belirli periyotlarla çağırırsanız veriyi almış olursunuz.

Sadece 1 saniye bağlı kaldığında belki kod donar ama veriyi alıp bağlantıyı sonlandırdığınızda server normale döner. Bu durumda en fazla 1 sn gecikme yaşamış olursunuz.

Bu en basit yok.

Diğeri daha önce belirttiğim çoklu işleme yöntemi, amatam konuya hakim değilim dediğiniz için bir şey diyemiyorum.

Diğer taraftan klima gibi güç çeken cihazları röle hele ki ucuz röle modülleir ile sakın uzun süreli kullanmayın.

1 Kanal 5 V Röle Kartı Satın Al | Robotistan

Yukarıdaki tarz röleler her ne kadar üzerinde 10 amper yazsa da çok tehlikeli rölelerdir.

Kaldı ki bu röleler tek kontak olduklarında hem nötr hem de faz hattını kesmezler. Sadece tek hattı kesebilirler, ki genelde güç düşümü ile üzerinden geçen yükü azaltmak için nötr hattına bağlanabilir ki bu da çok tehlikeli, cihazın içine fazı doğrudan vermiş oluyorsunuz.

Schneider LC1D18 Kontaktör 18A TP 1NO+1NC 220VAC Fiyatları ve Özellikleri (n11.com)

Yada siemens in 10-16 Amper kontaktörlerini kullanmadan klima gibi cihazlara enerji sağlamak iki kere düşünelecek bir iştir.

Şöyle enerji değerlerine bakıyorum 12.000 btu bir klima neredeyse 10-12 amper çekiyor.

Rölelerinize bu nedenle dikkat edin.

Kolay gelsin.

2 Beğeni