Arduino da Yer Kaplayan Değişken Sorunu

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
11,212
Değişkenler ile ilgili bir çözüm bulabilir miyiz?
Daha kodun yarısını ancak yazdım ama şimdiden 2048 byte belleğin 1778 bayte'ını kullanmışım.
Geriye kalmış 280 byte ve bu yetecek gibi görünmüyor.

Global değişkenler belleğin 1778 byte kadarını (86%) kullanıyor. Yerel değişkenler için 270 byte yer kalıyor. En fazla 2048 byte kullanılabilir.
Düşük hafıza mevcut, kararlılık problemlerine sebep olabilir.
 
Şu nanoya benzeyen stmf104 lerden kullanmayı düşünenilirsin. Arduino ide ile kodlanıyor sanırım. İlla 328 ile devam edecem diyorsan kodu daha iyi tasarlamalısın.

Bence elinde mega varsa onda yaz en son sistem çalıştıktan sonra ne yapacağına karar ver.
 
Şu nanoya benzeyen stmf104 lerden kullanmayı düşünenilirsin. Arduino ide ile kodlanıyor sanırım. İlla 328 ile devam edecem diyorsan kodu daha iyi tasarlamalısın.

Bence elinde mega varsa onda yaz en son sistem çalıştıktan sonra ne yapacağına karar ver.
F() makrosu ve Progmem diye bişeyden bahsediyorlar. Video izliyorum. Bakim bişey çıkacak mı.
 
Programın tamamını koy istersen neymiş bu globaller görelim.

Tabi kütüphanelerin durumunu bilmiyoruz, onların da globalleri olabilir. O yüzden grafik kütüphanesini kaldırıp, kütüphaneyi çağıran kodları da devre dışı bırakıp bir daha derle. Eğer global RAM baya boşalıyorsa o zaman grafik kütüphanesi bütün belleği yiyor demektir.
 
Programın tamamını koy istersen neymiş bu globaller görelim.

Tabi kütüphanelerin durumunu bilmiyoruz, onların da globalleri olabilir. O yüzden grafik kütüphanesini kaldırıp, kütüphaneyi çağıran kodları da devre dışı bırakıp bir daha derle. Eğer global RAM baya boşalıyorsa o zaman grafik kütüphanesi bütün belleği yiyor demektir.
bende onu bekliyorum abi programı görsem baştan aşşağı dikkatimi çekenleri yoruma çevirip bakacağım
 
Abi şöyle yapayım;
Bu ilk kod bloğunda değişkenler var.
İzlediğim videoda arkadaş diyorki sabit değişkenleri "const ve "PROGMEM" kullanarak Sram den Flash Belleğe Atabilirsin.
Aynısını yaptım 1% bide değişim olmadı.

C:
// Röle devresi
const int onikiv PROGMEM = 3;
const int yirmialtiv PROGMEM = 4;
const int otuzikiv PROGMEM = 5;
const int fan_led PROGMEM = 2;

// End of constructor list
const int currentSensor PROGMEM = A5;
const int voltageSensor PROGMEM = A1;
float vOUT = 0.0;
static float vIN = 0.0;
const float R1 PROGMEM = 10000.0;
const float R2 PROGMEM = 1500.0;
float Vdata = 0;
float V, I;
float Cdata;
float value;
static char buffer[100];

// LM35 Sıcaklık Sensörü
const int lm35Pin PROGMEM = A7;
int lm35 = 0;
float sicaklik_gerilim = 0;
int sicaklik = 0;

Burası da kodun tamamı;
C:
//128x64 Ekran
#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

//U8G2_ST7920_128X64_F_8080 u8g2(U8G2_R0, 8, 9, 10, 11, 4, 5, 6, 7, /*enable=*/ 18 /* A4 */, /*cs=*/ U8X8_PIN_NONE, /*dc/rs=*/ 17 /* A3 */, /*reset=*/ 15 /* A1 */);  // Remember to set R/W to 0
U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 17 /* A3 */, /* CS=*/ 16 /* A2 */, /* reset=*/ U8X8_PIN_NONE);
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* CS=*/ 10, /* reset=*/ 8);
//U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 14, /* data=*/ 13, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS
//U8G2_ST7920_128X64_F_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8);
//U8G2_ST7920_128X64_F_HW_SPI u8g2(U8G2_R0, /* CS=*/ 15, /* reset=*/ 16); // Feather HUZZAH ESP8266, E=clock=14, RW=data=13, RS=CS

// Röle devresi
const int onikiv PROGMEM = 3;
const int yirmialtiv PROGMEM = 4;
const int otuzikiv PROGMEM = 5;
const int fan_led PROGMEM = 2;

// End of constructor list
const int currentSensor PROGMEM = A5;
const int voltageSensor PROGMEM = A1;
float vOUT = 0.0;
static float vIN = 0.0;
const float R1 PROGMEM = 10000.0;
const float R2 PROGMEM = 1500.0;
float Vdata = 0;
float V, I;
float Cdata;
float value;
static char buffer[100];

// LM35 Sıcaklık Sensörü
const int lm35Pin PROGMEM = A7;
int lm35 = 0;
float sicaklik_gerilim = 0;
int sicaklik = 0;
////////////////////////

void setup(void) {
  Serial.begin(9600);
  pinMode(onikiv, OUTPUT);
  pinMode(yirmialtiv, OUTPUT);
  pinMode(otuzikiv, OUTPUT);
  pinMode(fan_led, OUTPUT);

  digitalWrite(onikiv, HIGH);
  digitalWrite(yirmialtiv, LOW);
  digitalWrite(otuzikiv, LOW);
  digitalWrite(fan_led, LOW);

  // initialize the LCD
  u8g2.begin();
}
//// ÇERÇEVE OLUŞTURMA FONKSİYONU/////////////
void drawF(int x, int y, int width, int height, int x2, int y2, int width2, int height2) {
  u8g2.drawFrame(x, y, width, height);
  u8g2.drawFrame(x2, y2, width2, height2);
}
/////////////////////////////////////////////
//// SICAKLIĞI EKRANA BASMA FONKSİYONU /////
void temp(int temp) {
  u8g2.setFont(u8g2_font_6x10_tr);
  u8g2.drawStr(90, 32, "Tem");
  u8g2.setFont(u8g2_font_6x10_tr);
  u8g2.drawStr(108, 31, "p");
  u8g2.setFont(u8g2_font_unifont_t_weather);
  u8g2.drawStr(113, 39, "\u0031");
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.setCursor(94, 40);
  u8g2.print(temp);
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.drawStr(107, 40, "C");
}
///////////////////////////////////////////

void loop(void) {
  // LM35 Sıcaklık Sensörü
  for (int i = 0; i < 350; i++) // daha kararlı ortalama bir sonuç almak için 50 kez okuma yapma
  {
    lm35 = lm35 + analogRead(lm35Pin);
    delay(1);
  }
  lm35 = lm35 / 350;
  sicaklik_gerilim = (5000.0 / 1023.0) * lm35;
  sicaklik = sicaklik_gerilim / 10.0;

  ///////////////////////////////////

  for (int i = 0; i < 300; i++) // daha kararlı ortalama bir sonuç almak için 300 kez okuma yapma
  {
    Cdata = Cdata + analogRead(currentSensor);
    Vdata = Vdata + analogRead(voltageSensor);
    delay(1);
  }

  Cdata = Cdata / 300;
  V = (Cdata / 1024.0) * 5000;
  I = ((V - 2484) / 66);
  //I = (2.5 - (Cdata * (5.0 / 1024.0)) )/0.066;


  Vdata = Vdata / 300;
  vOUT = (Vdata * 5.0) / 1024.0;
  vIN = (vOUT / (R2 / (R1 + R2)));
  u8g2.clearBuffer();
  //// Volt Çerçeve ////////////////////////
  drawF(0, 0, 85, 25, 1, 1, 83, 23);
  //////////////////////////////////////////
  //// Voltaj değerini ekrana yazdırma /////
  //drawPrnt(u8g2_font_VCR_OSD_tr, 21, 0, 5, 5, 21, "V", buffer, 1);
  int ival = vIN * 100;
  sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
  u8g2.setFont(u8g2_font_VCR_OSD_tr);
  u8g2.drawStr(21, 0, 5);
  u8g2.setCursor(5, 21);
  u8g2.print(buffer);
  u8g2.setCursor(69, 21);
  u8g2.print(F("V"));
  ival = 0;
  /////////////////////////////////////////
  //// Akım Çerçeve ////////////////////////
  drawF(0, 26, 85, 25, 1, 27, 83, 23);
  //////////////////////////////////////////
  //// Amper değerini ekrana yazdırma //////
  double valueI = (I <= 0) ? 00.00 : I;
  ival = valueI * 100;
  sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
  u8g2.setFont(u8g2_font_VCR_OSD_tr);
  u8g2.drawStr(69, 0, 5);
  u8g2.setCursor(5, 47);
  u8g2.print(buffer);
  u8g2.setCursor(69, 47);
  u8g2.print(F("A"));
  /////////////////////////////////////////
  //// CV ÇERÇEVE ////////////////////////
  drawF(0, 52, 42, 12, 1, 53, 40, 10);
  //////////////////////////////////////////
  //// CV DEĞERİNİ EKRANA YAZDIRMA ////////////////////////
  /*  u8g2.setFont(u8g2_font_micro_tr  );
    u8g2.setCursor(6, 61);
    u8g2.print("CV:12.52");*/
  //////////////////////////////////////////
  //// CC ÇERÇEVE ////////////////////////
  drawF(43, 52, 42, 12, 44, 53, 40, 10);
  //////////////////////////////////////////
  //// CC DEĞERİNİ EKRANA YAZDIRMA ////////////////////////
  /*u8g2.setFont(u8g2_font_micro_tr  );
    u8g2.setCursor(49, 61);
    u8g2.print("CC:02.52");*/
  //////////////////////////////////////////
  //// Kademe Çerçeve //////////////////////
  drawF(86, 0, 42, 21, 87, 1, 40, 19);
  if (vIN <= 11.00) {
    digitalWrite(yirmialtiv, LOW);
    digitalWrite(otuzikiv, LOW);
    delay(100);
    digitalWrite(onikiv, HIGH);
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(90, 10, "Kademe");
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.drawStr(93, 17, "12 Volt");
  } else if ((vIN >= 11.10) && (vIN <= 25.00)) {
    digitalWrite(onikiv, LOW);
    digitalWrite(otuzikiv, LOW);
    delay(100);
    digitalWrite(yirmialtiv, HIGH);
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(90, 10, "Kademe");
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.drawStr(92, 17, "26 Volt");
  } else if (vIN >= 25.10) {
    digitalWrite(onikiv, LOW);
    digitalWrite(yirmialtiv, LOW);
    delay(100);
    digitalWrite(otuzikiv, HIGH);
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(90, 10, "Kademe");
    u8g2.setFont(u8g2_font_chikita_tr);
    u8g2.drawStr(92, 17, "32 Volt");
  }
  //////////////////////////////////////////
  //// Temp Çerçeve ////////////////////////
  drawF(86, 22, 42, 22, 87, 23, 40, 20);

  if (sicaklik <= 38) {
    digitalWrite(fan_led, LOW);
    temp(sicaklik);
  } else if (sicaklik >= 45) {
    digitalWrite(fan_led, HIGH);;
    temp(sicaklik);
  } else {
    temp(sicaklik);
  }
  //////////////////////////////////////////
  //// Watt Çerçeve ////////////////////////
  drawF(86, 45, 42, 19, 87, 46, 40, 17);
  //////////////////////////////////////////
  //// Watt hesaplama ve ekrana yazdırma ///
  double value = (I * vIN < 0) ? 0.00 : I * vIN;
  u8g2.setFont(u8g2_font_chikita_tr);
  u8g2.drawStr(119, 60, "W");
  u8g2.setFont(u8g2_font_chikita_tr);
  //u8g2.setFont(u8g2_font_profont10_tn);
  u8g2.setCursor(93, 58);
  u8g2.print(value);
  //////////////////////////////////////////
  u8g2.sendBuffer();
  //// Değerleri sıfırlama ////////////////
  Cdata = 0;
  I = 0;
  V = 0;
  Vdata = 0;
  vIN = 0;
  value;
  delay(500);
}
 

Ekler

  • 128x64_ekran_Triyakli_Guc_kaynak.ino
    7.2 KB · Görüntüleme: 101
Tabi kütüphanelerin durumunu bilmiyoruz, onların da globalleri olabilir. O yüzden grafik kütüphanesini kaldırıp, kütüphaneyi çağıran kodları da devre dışı bırakıp bir daha derle. Eğer global RAM baya boşalıyorsa o zaman grafik kütüphanesi bütün belleği yiyor demektir.
O zaman zaten birşey kalmıyor ki kodun içinde.
 
Şu anda görünen globaller 144 byte yer kaplıyor. Onun 100 byte'ını da buffer kaplıyor. 100 byte olması gerekmiyor o. Display'e gönderdiğin string en fazla kaç byte olabilirse onu yap.

Bir de sabitlerin hepsini #define olarak değiştir, bunlar hafızada yer kaplamaz.

C++:
#define onikiv 3

Ama işte bunların hepsini yapsan bile globaller 50 byte'a falan iniyor. Geri kalan hafızayı yiyen senin grafik kütüphanesi herhalde.
 
Şu anda görünen globaller 144 byte yer kaplıyor. Onun 100 byte'ını da buffer kaplıyor. 100 byte olması gerekmiyor o. Display'e gönderdiğin string en fazla kaç byte olabilirse onu yap.

Bir de sabitlerin hepsini #define olarak değiştir, bunlar hafızada yer kaplamaz.

C++:
#define onikiv 3

Ama işte bunların hepsini yapsan bile globaller 50 byte'a falan iniyor. Geri kalan hafızayı yiyen senin grafik kütüphanesi herhalde.
U8g2 nin bir tane test sayfasını açıp derledim. Kendi başına 42% yer kaplıyor.
Bu ekran ile başım dertte ya. I2C tanımıyor, kendi başına çok yer kaplıyor. Ne yapacağım bilmiyorum.
 
Şu anda görünen globaller 144 byte yer kaplıyor. Onun 100 byte'ını da buffer kaplıyor. 100 byte olması gerekmiyor o. Display'e gönderdiğin string en fazla kaç byte olabilirse onu yap.

Bir de sabitlerin hepsini #define olarak değiştir, bunlar hafızada yer kaplamaz.

C++:
#define onikiv 3

Ama işte bunların hepsini yapsan bile globaller 50 byte'a falan iniyor. Geri kalan hafızayı yiyen senin grafik kütüphanesi herhalde.
Abi ben grafik kütphanesi ile çok oynadım en fazla %36 kullandırabildim
onlarca yazı yazdırdım onlarca çerçeve çizdirdim %36yı geçemedim
 
U8g2 nin bir tane test sayfasını açıp derledim. Kendi başına 42% yer kaplıyor.
Bu ekran ile başım dertte ya. I2C tanımıyor, kendi başına çok yer kaplıyor. Ne yapacağım bilmiyorum.
sistem oturmuş ama "openGLCD" adında bir kütpahne daha var kullanmadım sadece duymuştum onu da deneybiliriz
 
glcd.png

openGLCD kütüphanesinin hello world'ü %19 yer tuttu
 
openGLCD kütüphanesinin hello world'ü %19 yer tuttu

O toplam kullandığı bellek. İkinci satıra bakarsan sadece 57 byte global RAM kullanıyor. Gökhan'ın program 1778 byte götürmüş ...
 
glcdtest.png

buda çok yer tuttu grafik test örneği %53 yer tuttu
73 de globalde tutmuş
 
Senin programı minimal hale getirdim. Gene de 1417 byte RAM yimiş

C++:
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

U8G2_ST7920_128X64_F_SW_SPI u8g2(U8G2_R0, /* clock=*/ 18 /* A4 */ , /* data=*/ 17 /* A3 */, /* CS=*/ 16 /* A2 */, /* reset=*/ U8X8_PIN_NONE);

void setup(void) {
  // initialize the LCD
  u8g2.begin();
}
void loop(void) {
}
 
Hayret birşey yav. Sadece u8g2lib.h header dosyasını bile eklesen 150 byte RAM götürüyor :katil2:

Sen hakkaten bu grafik kütüphanesini değiştir :)
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,837
Mesajlar
99,548
Üyeler
2,479
Son üye
yiyehuoxing32

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top