Merhabalar, Yeni yeni arduino ile uğraşmaya başladım. şimdiye kadar bir sıkıntım da yoktu fakat bugün bir sorunla karşılaştım yardıma ihtiyacım var gibi. iki çıkıştan birisi 1,5 saniyede bir high olup 1 saniye sonra low olacak delay(1500); digitalWrite(5,HIGH); delay(1000); digitalWrite(5,LOW); Diger pin de her 40 ms’de 10 ms çalışacak delay (40); digitalWrite(6,HIGH); delay(10); digitalWrite(6,LOW); gibi. bu kodları altalta ekleyip çalıştırınca 5’i açıp kapatıp sonra 6’ya geçdiğinden 6 sadece 1540 ms’de bir çalışmış oluyor. Aynı fonksiyon olarak yazıp loop’ta onu çalıştırdığımda da değişen birşey olmadı. Şimdiden teşekkürler…
moduler aritmetik kullanırsın 1ms lik beklersin 10ms olunca biri, 40m olunca diğeri, 1000ms de diğer vs vs çalışır. if (delaysay % 10=0) {digitalWrite(6,LOW);} if (delaysay % 40=0) {digitalWrite(6,HIGH);} if (delaysay % 1500=0) {digitalWrite(5,HIGH);delaysay=0} if (delaysay % 1000=0) {digitalWrite(5,LOW);} delay(1); delaysay=delaysay+1; //edit: yukarıdaki 1500 satırında sayacı sıfırladım ama bu sefer alttaki 1000li sayaç zamanı bozulacak 1500 satırında delaysay=0 yazmak yerine delaysay=500 yazılırsa 1000 lik satır zamanlaması bozulmaz. ama delaysay=0 diye hiç yazmasak daha iyi gerek yok sıfırlamaya…
Doğru ya, çok mantıklı integer bir değişkeni her milisaniyede bir arttırırsam istediğim yerde istediğimi işlemi yaptırabilir değl mi? Çok teşekkür ederim.
selamlar bende yeni başladım programlamaya. Aynı sorun bende de var. ama “okoman” paylaştığı koddan da bişe anlamadım. Biraz daha ayrıntılı anlatabilir misiniz ?
moduler aritmetik kullanımı https://www.arduino.cc/en/Reference/modulo delaysay devamlı 1ms de bir artarak gidiyor diyelim 10ms de 40ms de 1500ms de ve 1000ms de bazı işler yapman lazım. delaysay her 10 olduğunda bir tetik yapmak için moduler aritmetik kullandım delaysay 10 olduğunda modfonksiyonu 0 değerini verir diğerleri de benzer mantıkta çalışır. tek tek eğer delaysay=10 ise şunu yap demeye kalksam sadece bir kere yapar yada her iş için ayrı sayaç yapmam lazım. moduler aritmetik kullanınca sayaçı sıfırlamam gerek kalmadan her 10lu 40lı 1000li 1500li değerlerde işlem yapacak. biraz kod pratiğini arttır bolcana kod yaz ne demek istediğimi anlayacaksın ![]()
çok teşekkürler hızlı cevap için. yani biz en başta programa mili saniye olarak saydırmaya başlıyoruz. sonra o sürekli sayıyor. Sonsuz mu sayıyor ? Sizin yazdığınız kodda şunu mu demek istiyor; if (delaysay % 10=0) {digitalWrite(6,LOW);} her 10 milisaniyede bir D6 pini 0 olsun ? Yukarıdaki kodun yanına açıklamalı halde yazabilir misiniz ? hatta ben kendi kodumu ekliyim ne yapnak istediğimi anlatayım birazdan.
include<liquidcrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
const int trigger_pin = 10;
const int echo_pin = 11;
int sure;
float mesafe;
float c;
float h;
float sesh;
void setup()
{
pinMode(trigger_pin, OUTPUT);
pinMode(echo_pin, INPUT);
Serial.begin(9600);
lcd.begin(16,2);
}
void loop()
{
delay(100);
c = analogRead(A0);
c = c * ((5.01000/1023)/10);
sesh = (0.6c)+331.5;
h = (sesh*100)/1000000;
h = 1/h;
digitalWrite(trigger_pin, HIGH);
delay(1);
digitalWrite(trigger_pin, LOW);
sure= pulseIn(echo_pin, HIGH);
mesafe = (sure/2) /h;
lcd.clear();
Serial.println(mesafe);
Serial.println(c);
Serial.println(h);
lcd.print(mesafe);
lcd.print(" cm");
lcd.setCursor(9, 0);
lcd.print(c);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print(sesh);
lcd.print(" m/sn ");
lcd.blink();
}
bu benim netten araştırarark yazdığım bir kod. HCSR04 sensörünün hesaplamasına lm35 de ekleyip gerçekçi ölçme için yaptım. yani sıcaklığa göre ses hızını hesaplayıp ona göre mesafeyi söylesin diye.
Burda birinci sıkıntım, lcd clear komutundan dolayı ekran hep yanıp sönüyomuş gibi oluyor 200ms de bir. bunun bir çözümü var mı ?
ikincisi delay 200ms ama ben sensöre 1ms de bir ölçüm yaptırıyorum. ama 200 + 1 =201 ms de bir mi trigger ve echo okuması yapıyo ? yanlış mı yapmışım ?
üçüncüsü de lcd de bir animasyon yapmak istiyorum. şu simgeler sırasıyla çıkacak; “|/-” yani çizgi dönüyormuş gibi tek karakter yerinde bu simgeleri tek tek çıkartacak. çizgi dönüyormuş efekti yaratacak ama bunun göz tarafından anlaşılabilmesi için her çizgi arasında 300 vb. ms delay lazım. ben bunu nasıl eklicem bu koda ?</liquidcrystal.h>
if (delaysay % 10=0) {digitalWrite(6,LOW);} sunu demek istiyor. delaysay mod 10 a gore sıfır kalanını verirse islemi yap. veya soyle anlatayım. daha iyi anlarsınız. delaysay 10 'un ile tambolunurse kalansız. islemi gerceklestir. bence islemin sonuna suda eklenebilirdi. if (delaysay==1500) {delaysay=0;} delaysay fazla kasmazdı busayede.
birde su kodlari dene include <pt.h>
// PIN number on Arduino Board
static int LED_RED_PIN = 3;
static int LED_GREEN_PIN = 2;
// milli-seconds
static int LED_RED = 1500;
static int LED_GREEN = 400;
static struct pt pt1, pt2;
void led_toggle( int led ) {
digitalWrite( led, !digitalRead( led ) );
}
static int thread1( struct pt *pt ) {
static unsigned long timestamp = 0;
PT_BEGIN( pt );
while(1) {
PT_WAIT_UNTIL( pt, millis() - timestamp > LED_RED );
led_toggle( LED_RED_PIN );
timestamp = millis();
}
PT_END( pt );
}
static int thread2( struct pt *pt ) {
static unsigned long timestamp = 0;
PT_BEGIN( pt );
while(1) {
PT_WAIT_UNTIL( pt, millis() - timestamp > LED_GREEN );
led_toggle( LED_GREEN_PIN );
timestamp = millis();
}
PT_END( pt );
}
void setup() {
pinMode( LED_RED_PIN, OUTPUT );
pinMode( LED_GREEN_PIN, OUTPUT );
PT_INIT( &pt1 );
PT_INIT( &pt2 );
}
void loop() {
thread1( &pt1 );
thread2( &pt2 );
}</pt.h>
bide millis fonksiyonuna bakabilrisiniz https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-201/millis-fonksiyonu-nedir-ve-nerelerde-kullanilir
lcd ye i2c modül taktım şu an onla uğraşıyorum cevap yazamadım kusura bakmayın. i2c modülüyle kullanamadım bir türlü kelimelerin sadece baş harfleri yazıyor. devamı yok.
sn. yucell verdiğim linki inceleyiniz… http://www.cazda.com/arduino-16x2-20x4-lcd-panellerde-sadece-ilk-karakter-gosterme-sorunu/
Digimensch Verdiğin kodları ben kullandım ama static struct pt pt1, pt2; kısmında hata alıyorum.
eemuhendislik hepsini denedim ama olmadı. arduinoyu silip 1.0.5 sürümünü yükledim hiç bir sorun kalmadı.
yukarıdaki kodu paylaştığım şeyi anlatacak olan var mı ?
Merhaba arduino mega da 20 farklı millis komutu kullanabilirmiyim örneğin: zaman1 = millis(); zaman2 = millis();
100 tane bile kullanırsın. milis komutu işlemciye elektrık verdiğin ilk andan şimdiye kadar gecen milisaniyeyi sayan bir sayaç. bunu bir değişkene atadıgın zaman o zaman bılgısını saklamış kaydetmiş oluyorsun. bir oncekı mılıs degerı ıle şimdiki milis arasındaki fark ıkı konum arasındaki gecen mılısanıye suresı oluyor