Lezzetli Robot Tarifleri Sosyal'e Hoş Geldiniz.. Devamı..

Giriş Yap Üye Ol


Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
LCD ye delay kullanmadan belirli zamanda değişen yazı yazdırma sorunu
#1
Merhabalar, 
Lcd ye belirli aralıklarla değişen yazılar yazdırmak istiyorum. Aynı zamanda arduino farklı işlemlerde yaptığından delay kullanamıyorum. millis ile denedim fakat döngü oluşturamadım. İlk yazı geliyor 5 sn sonra ikinci yazı geliyor fakat başa dönmüyor son yazı ekranda kalıyor ve hızlı bir şekilde yanıp sönüyor. Yardımcı olabilirseniz çok sevinirim.
Kod:
void ekran ()

{
 unsigned long eskiZaman = 0;
 unsigned long yeniZaman;
 yeniZaman = millis();
 if (yeniZaman - eskiZaman > 1)
 {
   lcd.home();
   lcd.clear();
   DateTime now = RTC.now();
   lcd.setCursor(0, 0);
   if (now.day() < 10)
     lcd.print('0');
   lcd.print(now.day(), DEC);
   lcd.print('-');
   if (now.month() < 10)
     lcd.print('0');
   lcd.print(now.month(), DEC);
   lcd.print('-');
   lcd.print(now.year(), DEC);
   lcd.print(' ');
   lcd.setCursor(11, 0);
   if (now.hour() < 10)
     lcd.print('0');
   lcd.print(now.hour(), DEC);
   lcd.print(':');
   if (now.minute() < 10)
     lcd.print('0');
   lcd.print(now.minute(), DEC);

   lcd.setCursor(0, 1);
   lcd.print (sicaklik);
   lcd.setCursor(5, 1);
   lcd.print((char)223);
   lcd.setCursor(6, 1);
   lcd.print("C");
   lcd.setCursor(9, 1);
   lcd.print ("pH:");
   lcd.setCursor(12, 1);
   lcd.print("10,1");
 }

 if (yeniZaman - eskiZaman > 5000)
 {
   lcd.clear();
   lcd.setCursor(5, 0);
   lcd.print ("DENEME");
   lcd.setCursor(1, 1);
   lcd.print("DENEME DENEME");
 }
}
Ara
Cevapla
#2
Void ekran fonksiyinunu sadece void setup fonksiyonu icinde mi kullandiniz ?
Proteus, Altium Designer, SolidWorks, AutoCAD.
CCS C, Arduino, Keil.
AVR, ARM Cortex-M3, PIC16/18, dsPIC33.
Ara
Cevapla
#3
Şu Şekil

Kod:
void loop()
{
 roleler();
 dozaj();
 aydinlatma();
 ekran ();
}

Tüm Kod

Kod:
int LM35 = A2;
int suSensor = A3;
int dozajPompa1 = 3;
int dozajPompa2 = 4;
int dozajPompa3 = 5;
int dozajPompa4 = 6;
int psRole = 7;
int fan = 8;
int isitici = 9;
int suTamamlama = 10;

int fanDurum = 0;
int isiticiDurum = 0;
int suSensorDurum = 0;
int psDurum = 0;
float sicaklik;
int cDenGelen;

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f , 16 , 2);
RTC_DS1307 RTC;

void setup()
{
 { Wire.begin();
   RTC.begin();
   lcd.begin();
 }
 { Serial.begin(9600);
   pinMode(LM35, INPUT);
   pinMode(suSensor , INPUT);
   pinMode(dozajPompa1, OUTPUT);
   pinMode(dozajPompa2, OUTPUT);
   pinMode(dozajPompa3, OUTPUT);
   pinMode(dozajPompa4, OUTPUT);
   pinMode(psRole, OUTPUT);
   pinMode(fan, OUTPUT);
   pinMode(isitici, OUTPUT);
   pinMode(suTamamlama, OUTPUT);

   // Röle modülü Active Low olduğu için tüm rölelere HIGH gönderip kapattım.
   digitalWrite(dozajPompa1, HIGH);
   digitalWrite(dozajPompa2, HIGH);
   digitalWrite(dozajPompa3, HIGH);
   digitalWrite(dozajPompa4, HIGH);
   digitalWrite(psRole, HIGH);
   digitalWrite(fan, HIGH);
   digitalWrite(isitici, HIGH);
   digitalWrite(suTamamlama, HIGH);
 }
 unsigned long eskiZaman = 0;
 unsigned long yeniZaman;
}

void loop()
{
 roleler();
 dozaj();
 aydinlatma();
 ekran ();
}
Ara
Cevapla
#4
Merhaba "dosya> Örnekler> digital>blinkwithoutdelay " örneğini açarak orada paralel algoritmanın örneği mevcut.
Sorununuz Olursa Tek ÖM Yeterli  
maker by Alperen Alpaydın   
     TEŞEKKÜR İÇİN REP BUTONUNU KULLANINIZ



Cevapla
#5
Ekran fonksiyonunda bulunan yerel degiskenleri global degisken olarak kullanmayi deneyin. Cunku her fobksyiona girdiginizde eski zaman degiskeni hep sifirlaniyor. Zaten surekli yenileniyor eski zamani bu sekilde hep sifirlamis oluyorsunuz.
Proteus, Altium Designer, SolidWorks, AutoCAD.
CCS C, Arduino, Keil.
AVR, ARM Cortex-M3, PIC16/18, dsPIC33.
Ara
Cevapla
#6
Çok anladığımdan değil ama senin sorununu iç kesme (timer) olayı çözer diye düşünüyorum. Tüm programdan bağımsız çalışan bir timer, bence bunu araştırmalısın.

http://letsmakerobots.com/content/arduin...interrupts
Ara
Cevapla
#7
Millis fonksiyonu timer donanimini kullaniyor .timer kesmesini kullanirsa millis fonksyonu sorun yaratacaktir. Ya millisi kaldirip kendi ayarlamasi lazim timer donanimini ya da bu sekilde kenidisi zaten halletmeye calismis ki mantik hatasi yok. Kural hatasi var hepsi bu.

Buradaki bir cok arkadas avr bilmediginden bunu anlamalari biraz guc gelebilir. Ancak size katiliyorum kesme her zaman en iyisidir.
Proteus, Altium Designer, SolidWorks, AutoCAD.
CCS C, Arduino, Keil.
AVR, ARM Cortex-M3, PIC16/18, dsPIC33.
Ara
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Exclamation 5110 LCD sorunu Ali Erşad 3 81 02-01-2017, Saat: 18:35
Son Yorum: AlperrTG
  Arduino Kod Sorunu [ÇÖZÜLDÜ] kayabesim 5 95 30-12-2016, Saat: 19:27
Son Yorum: AlperrTG
  DHT11 kod sorunu. Semih6868 1 51 26-12-2016, Saat: 21:35
Son Yorum: AlperrTG

Hızlı Menü:


Konuyu Okuyanlar:
1 Ziyaretçi