kulandığım Ekran 16x2 (0x27) dış kesme ile ekrana yazı yazdırmak istedim ama her zaman yaptığım yöntemi kullanmama rağmen olmadı. Kullanılan modülün bunda etkisi var mıdır varsa bir yöntemi var mı?
lcd.init(); // lcd başlatılır,Güç verilir. lcd.backlight(); // lcd arka plan ışığı aktif edilir.
lcd.setCursor(0,0); // imleç 0. sütun 0. satıra gelir. lcd.print("BASLATILIYOR..."); // Ekrana yazdırır. delay(300); // 300 ms süre
for(int i=16 ; i>=0 ; i--){ // For döngüsü ile sola kayan yazı yapımı. lcd.setCursor(i,1); // imleç i. sütun 0. satıra gelir. lcd.print("LI-PO SARJ EDICI"); // Ekranda sola doğru kayacak olan yazı. delay(200); } // Geçiş için 200 ms süre ayarlandı.
for (int i = 0; i < 300; i++) // Daha kararlı sonuç için 300 kere okuma yapılıyor. { Cdata = Cdata + analogRead(currentSensor); delay(1); } Cdata=Cdata/300;
Kesme içinden LCD'ye pekala yazdırılabilir. Ancak kesme anında normal döngüde LCD'ye gönderilen bir komutun yarım kalması ve bu yüzden kesme içinde LCD'ye göndereceğiniz kodun tutarsız sonuçlar vermesine neden olacaktır. Ayrıca ve kesmeden çıkıp döngüye dönüldüğünde, yarıda kesilen LCD veri transferine devam edilecek ve yine tutarsız ve beklenmeyen sonuçlar ortaya çıkacaktır. LCD ile iletişim yavaş olduğundan kesme içinde içinde LCD'ye yazmak normal döngünün işleyişinde gecikmelere sebep olacaktır. Kesme değişken atamaları yapıp ana döngüde bu değişkenleri kullan. 1 aylık başlıkmış sorunu çoktan çözmüşsündür...
buton kesme olarak tanımladığım kısmın çalışıp ekrana yazmasını istiyordum proteusta PCF8574 kullandım.
kodum :
-------------------------------------------
#include <ACS712.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const int currentSensor = A0;
float Cdata=0;
float value;
float V,I;
int analogCell_1 = A1; // Hücre_1 okuma pini
int analogCell_2 = A2;
int analogCell_3 = A3;
//float vout = 0.0;
float vc1 = 0.0, vc2 = 0.0, vc3 = 0.0;
float R1 = 100000.0; // 100K ohm direnç
float R2 = 10000.0; // 10K ohm direnç
//int V_data = 0;
int sn=0; int dk=0; int sa=0; //Zaman göstergesi için tanımlamalar.
void setup()
{
pinMode(analogCell_1, INPUT);
pinMode(analogCell_2, INPUT);
pinMode(analogCell_3, INPUT);
attachInterrupt(0, buton_kesme , RISING);
lcd.init(); // lcd başlatılır,Güç verilir.
lcd.backlight(); // lcd arka plan ışığı aktif edilir.
lcd.setCursor(0,0); // imleç 0. sütun 0. satıra gelir.
lcd.print("BASLATILIYOR..."); // Ekrana yazdırır.
delay(300); // 300 ms süre
for(int i=16 ; i>=0 ; i--){ // For döngüsü ile sola kayan yazı yapımı.
lcd.setCursor(i,1); // imleç i. sütun 0. satıra gelir.
lcd.print("LI-PO SARJ EDICI"); // Ekranda sola doğru kayacak olan yazı.
delay(200); } // Geçiş için 200 ms süre ayarlandı.
delay(1000); // Döngü bittikten sonra ekranda 1000ms bekleme süresi.
lcd.clear(); // Ekranı temizle
//TIMER1 KESMESİ AYARLANIYOR
cli();
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = 0;
OCR1A = 15624; // 1 saniye çalışması için gerekli zaman kesmesi frekansı
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12) | (1 << CS10);
TIMSK1 |= (1 << OCIE1A);
sei();
}
void buton_kesme()
{
float C1=0.0, C2=0.0, C3=0.0;
C1 = vc1;
C2 = vc2 - vc1;
C3 = vc3 - vc2;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("C1:"); lcd.print(vc1,3); //lcd.print("V");
lcd.print(" C2:"); lcd.print(C2,3); //lcd.print("V");
lcd.setCursor(0,1);
lcd.print("C3:"); lcd.print(C3,3); lcd.print(" ");
attachInterrupt(0, degil_buton, FALLING);
}
void degil_buton()
{
attachInterrupt(0, buton_kesme, RISING);
}
void Current() // Çekilen akım fonksiyonu
{
for (int i = 0; i < 300; i++) // Daha kararlı sonuç için 300 kere okuma yapılıyor.
{
Cdata = Cdata + analogRead(currentSensor);
delay(1);
}
Cdata=Cdata/300;
V=(Cdata/1023.0)* 4995;
I=((V - 2500)/ 96);
//delay(10);
return I;
}
void V_cell_1 () // Hücre 1 gerilim fonksiyonu
{
float vout = 0.0;
int V_data = 0;
V_data = analogRead(analogCell_1);
vout = (V_data * 5.0) / 1023.0;
vc1 = vout / (R2/(R1+R2));
delay(300);
return vc1; // vc1 değerini döndür.
}
void V_cell_2 () // Hücre 2 gerilim fonksiyonu
{
float vout = 0.0;
float V_data = 0;
V_data = analogRead(analogCell_2);
vout = (V_data * 5.0) / 1023.0;
vc2 = vout / (R2/(R1+R2));
delay(300);
return vc2;
}
void V_cell_3 () // Hücre 3 gerilim fonksiyonu
{
float vout = 0.0;
float V_data = 0;
V_data = analogRead(analogCell_3);
vout = (V_data * 5.0) / 1023.0;
vc3 = vout / (R2/(R1+R2));
delay(300);
return vc3;
}
ISR(TIMER1_COMPA_vect){ //Her kesmeye girildiğinde otomatik çalıştırılacak fonksiyon.
sn++;
if(sn==60)
{
++dk;
sn=0;
}
if(dk==60)
{
++sa;
dk=0;
}
}
void loop()
{
Current(); // Akım fonksiyonunu çağır.
V_cell_1();
V_cell_2();
V_cell_3();
float C1=0.0, C2=0.0, C3=0.0;
C1 = vc1;
C2 = vc2 - vc1;
C3 = vc3 - vc2;
lcd.setCursor(0,0); // 0.sütun 0. satırdan başla.
lcd.print("ZAMAN : "); lcd.print(sa); lcd.print(":"); lcd.print(dk); lcd.print(":"); lcd.print(sn); // Geçen süreyi ekrana sa,dk,sn olarak yaz.
lcd.setCursor(0,1);
lcd.print("AKIM : "); lcd.print(I,3); lcd.print("A ");
}