Arduino millis() konusunda yardıma ihtiyacım var.

2 dk ile 15 dk lık test yeter yine ya
996 yapıp 15dk lık teste tabi tuttum. 2sn fark etti ama emin değilim. Çünkü işe gitmek için bir yandan hazırlanıyordum. Kafam karıştı o ara biraz. Tam odaklanamadım. Yarın kısmetse hem bu farkı iyice ölçeceğim hemde projeyi sonlandırıp manyetik karıştırıcıya devam edeceğim. O projeye de 2 gün ara veriyim dedim kaç gün geçti. Yaptıklarımı unutmadan döneyim.
 
Teklifiniz için çok teşekkür ederim daha araştırma kısmındayım, henüz teklifinizi değerlendirebilecek tecrübede değilim. Özellikle sizdeki kristalle sanırım voltaj kontrollü olanlardan. Bu kristal tipleri de çok ilginç gerçekten her geçen gün başka bir tane duyuyorum. Ben GPSDO yapmayı planlamıştım
bu videodan sonra. Benim bunu yapmamdaki amaç da çinden ucuz ama araştırdığım kadarıyla iş görür bir frekans metre sipariş vereceğim 8 digitlik 10MHz'e kadar 1Hz çözünürlüğü var.

Evet voltaj kontrollü. Milivolt başına 0.01 Hz gibi bir değişim yapıyor. TCXO olanlar kendi sıcaklığını ölçüyor ve otomatik olarak kompanse ediyor. OCXO olanlar daha iyi, içindeki dirençle kendisini ısıtıp sabit bir sıcaklığa getiriyor. Dışına sünger veya strafor köpükle izolasyon yaparsanız tam performansta çalışıyor. Yapmaya karar verirseniz çekinmeyin. Çin'den alırken isteyenlere vermek için özellikle fazla miktarda aldım. Henüz benim de tecrübem yok, ilk defa GPSDO yapacağım.

İki soru sorsam müsaadenizle eğer güvendiğim bir alet ile si5351 i ölçsem ve kalibre etsem frekansta çok bir kayma olmaz mı demek istiyorsunuz? Diğer sorum da NEO-6M olandan sipariş edecektim işe yaramaz mı gerçekten?

Bu sorunun cevabı hem si5351 modülündeki kristale, hem de ne kadar kaymanın sizin için önemli olduğuna bağlı. Standard radyo iletişimi için (GHz seviyesine çıkmayan) modül üzerindeki kristali kullanıp memnun olmayan duymadım. Yine de bana güvenmeyin, radyo işini bilen birilerine sorun :)

NEO-6M malesef kötü.
 
Aydınlandım.
19:15 den sonrası arduino hızı


 
Merhaba arkadaşlar, millis fonksiyonu ile ilgili yardıma ihtiyacım var yeni konu açmak yerine buraya yazayım dedim.
Bir güvenlik devresi yapmaya çalışıyorum. 3 adet dedektör var bu dedektörlerin 2 tanesine rf kumanda ile gecikme veriyorum.
Fakat yazmış olduğum kodda şöyle bir problem var, millis fonksiyonu tıpkı delay gibi çalışıyor buda sanırım while döngüsünden dolayı.
Yani 2.sensör için sinyal geldiğinde dedektöre 10 saniyelik gecikme veriyorum ama bu 10 saniyelik zaman içerisinde diğer dedektörlerden sinyal gelse bile kod 10sn boyunca gecikmeye uğruyor.

Yapmak istediğim gecikme verdiğim dedektör haricinde ki dedektörlerden sinyal geldiğinde gecikmeye uğramadan kodu çalıştırabilmek.
Bunun için kodda nasıl bir değişiklik yapmam gerekir?




Kod:
#define sensor1 4
#define sensor2 5
#define sensor3 6
#define beklet_sensor2 7
#define beklet_sensor3 8
#define alarm 10
#define akuled 11


int durum_sensor1 = 1;
int durum_sensor2 = 1;
int durum_sensor3 = 1;
int durum_beklet_sensor2 = 0;
int durum_beklet_sensor3 = 0;
int kes = HIGH;


unsigned long time;
unsigned long zaman = 0;

int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
float R1 = 100000.0; // 100K ohm direnç
float R2 = 10000.0; // 10K ohm direnç
int value = 0;


void setup()
{
  pinMode(sensor1, INPUT);
  pinMode(sensor2, INPUT);
  pinMode(sensor3, INPUT);
  pinMode(alarm, OUTPUT);
  pinMode(beklet_sensor2, INPUT);
  pinMode(beklet_sensor3, INPUT);
  Serial.begin(9600);
  attachInterrupt(0,kesme,RISING);
  pinMode(analogInput, INPUT);
}
void loop()
{
   value = analogRead(analogInput);
   vout = (value * 5.0) / 1024.0;
   vin = vout / (R2/(R1+R2));
   if (vin<0.09) {
   vin=0.0;
     }
     Serial.println(vin);
     if (vin <= 10){
       digitalWrite(akuled,HIGH);
     }

    durum_sensor1 = digitalRead(sensor1);
    durum_sensor2 = digitalRead(sensor2);
    durum_sensor3 = digitalRead(sensor3);
    durum_beklet_sensor2 = digitalRead(beklet_sensor2);
    durum_beklet_sensor3 = digitalRead(beklet_sensor3);


    if (durum_beklet_sensor2 == 1){
     durum_sensor2 = 1;
    Serial.println("kisa gecikme devrede");
    zaman = millis();
    while(millis() < zaman+10000);
    durum_sensor2 = digitalRead(sensor2);
    
        }
     if (durum_beklet_sensor3 == 1){
     durum_sensor3 = 1;
    Serial.println("uzun gecikme devrede");
    zaman = millis();
    while(millis() < zaman+15000);
    durum_sensor3 = digitalRead(sensor3);
    
        }
    
  if (durum_sensor1 == 0){
    digitalWrite(alarm,HIGH);
    Serial.println("ani_buton_devrede");
    time = millis();
    while(millis() < time+10000);
    digitalWrite(alarm,LOW);     
  }
   if(durum_sensor2 == 0){
    Serial.println("kısa_süre_devrede");
    digitalWrite(alarm,HIGH);
    time = millis();
    while(millis() < time+10000);
    digitalWrite(alarm,LOW);   
    
  }
    if(durum_sensor3 == 0){
    Serial.println("uzun_süre_devrede");
    digitalWrite(alarm,HIGH);
    time = millis();
    while(millis() < time+10000);
    digitalWrite(alarm,LOW);   
  }
 else {
  digitalWrite(alarm,LOW);
 }
 }
 void kesme()
 {
  digitalWrite(alarm,kes);
  digitalWrite(alarm,LOW);
  Serial.println("Alarm kapatıldı");
 
 }
 
Burası delay fonksiyonunun aynısı. millis() fonksiyonu "zaman+10000 " olana kadar bu döngü devam eder. Amaçladığınız nedir ? Ona göre yeniden düzenleyelim.
yapmak istediğim, if koşulları gerçekleştiğinde kodun beklemeden çalışması.
Kod:
if (durum_beklet_sensor2 == 1){
     durum_sensor2 = 1;
    Serial.println("kisa gecikme devrede");
    zaman = millis();
    while(millis() < zaman+10000);
    durum_sensor2 = digitalRead(sensor2);
    
        }
     if (durum_beklet_sensor3 == 1){
     durum_sensor3 = 1;
    Serial.println("uzun gecikme devrede");
    zaman = millis();
    while(millis() < zaman+15000);
    durum_sensor3 = digitalRead(sensor3);
    
        }

ilk if koşulu gerçekleştiğinde, 10 sn. geçene kadar diğer if koşulu gerçekleşşe bile kod 10 sn. beklemede kalıyor.
Bunu düzeltmek istiyorum sanırım burada millis fonksiyonunu yanlış kullanıyorum.

2.sensör veya 3.sensör için durum bekletme 1 olduğunda, diğer sensörlerden sinyal geldiğinde millis süresini beklemeden çalışmasını alarmın devreye girmesini istiyorum.
Umarım anlatabilmişimdir :) Teşekkürler
 
Burası delay fonksiyonunun aynısı. millis() fonksiyonu "zaman+10000 " olana kadar bu döngü devam eder. Amaçladığınız nedir ? Ona göre yeniden düzenleyelim.
Bence delayi state machine kullanarak burada etkisiz bırakabiliriz. Şimdilik şöyle bir kod salladım hata varsa düzeltebiliriz
C:
int stataVariable = 0,stateFirstTime,stateSecondTime;

switch(stateVariable)
{
    case 0:    stateVariable = 1;
    case 1:
    {
        stateFirstTime = millis();
        stateVariable = 2;
    }
    case 2:
    {
        stateSecondTime = millis();
        if(stateSecondTime - stateFirstTime > 10000) // Burada 10000 yerine istenilen zaman değeri yazılabilir
        {
            //TODO
        }
        stateVariable = 0;
    }
}
 
xxx:
if (durum_beklet_sensor2 == 1){
     durum_sensor2 = 1;
    Serial.println("kisa gecikme devrede");
    zaman = millis();
    while(millis() < zaman+10000);            // >>>>Bununla
    durum_sensor2 = digitalRead(sensor2);    //  <<<< Bu kodun 10 saniye sonra çalışmasını mı istiyorsunuz?
    
        }

"while(millis() < zaman+10000); " şeklinde değil de

if(millis()> zaman+10000){
//.....
}

Şeklinde kullanmak lazım. Tabii "zaman" değişkeninin değerinin de sürekli güncellenmemesi lazım ki bu koşul gerçekleşsin.

Yani ilk yaptığınız değişiklikle
xxx:
if (durum_beklet_sensor2 == 1){

     durum_sensor2 = 1;

    Serial.println("kisa gecikme devrede");

    zaman = millis();
    ....

değişiklik anını "zaman"a atıyorsunuz. Bunu 1 kere yapmalı ve 10 saniye sonra aşağıdaki kod çalışıp değişiklikleri geri alana kadar çalışmamalı
Yani ilk if koşulunun değişiklikler geri alınana kadar çalışmasını önlemek için bir koşul daha olmalı.

xxx:
if(millis()> zaman+10000){
 //.....
}
 
Bence delayi state machine kullanarak burada etkisiz bırakabiliriz. Şimdilik şöyle bir kod salladım hata varsa düzeltebiliriz
C:
int stataVariable = 0,stateFirstTime,stateSecondTime;

switch(stateVariable)
{
    case 0:    stateVariable = 1;
    case 1:
    {
        stateFirstTime = millis();
        stateVariable = 2;
    }
    case 2:
    {
        stateSecondTime = millis();
        if(stateSecondTime - stateFirstTime > 10000) // Burada 10000 yerine istenilen zaman değeri yazılabilir
        {
            //TODO
        }
        stateVariable = 0;
    }
}
Burada da "break;" kodlarını koysak bile her seferinde "stateSecondTime" ve "stateFirstTime" ard arda sürekli güncelleniyor.
 
@Bowman
xxx:
case 2:
    {
        stateSecondTime = millis();
        if(stateSecondTime - stateFirstTime > 10000) // Burada 10000 yerine istenilen zaman değeri yazılabilir
        {
            //TODO
            stateVariable = 0;
        }
        
    }

"stateVariable = 0;" satırını if koşulunun içine almak yetiyor gibi geldi bana. Bence de makul böyle...
 
Cevaplarınız ve önerileriniz için teşekkür ederim, ikisini de dikkate alıp deneyeceğim.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,957
Mesajlar
118,808
Üyeler
2,825
Son üye
karahanli7

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top