Seri port depolama
  • İyi çalışmalar diliyorum.
    Biriken verileri uzun süreli saklama işlemini nasıl başarabilirim ?
    Sensör verileri uzun süreli biriktiğinde seri port ta 500000 satır ile doluyor. Hafıza gereği yeni gelen veriler diğerlerini siliyor.. Örneğin bir txt dosyasına Günlerce biriken sensör verilerini kaydetmek istiyorum bu mümkünmü ?

    İyi akşamlar ...
  • küçük bir program yazmalısın PC üzerinde çalışan..
    bu program seri portu dinleyecek verileri alacak ve bir dosyaya yada (çok uzun süreli kayıtlar için) veritabanına yönlendirecek. c#, VB, delphi, C++ gibi derleyiciler kullanabilirsin..
    Saygılarımla..
  • cevap için teşekkür ederim. Forumda yönlendireceğiniz başlıklar var mı?
  • PC için mi soru anlamadım.Arduino serial monitorden sadece pc ye veri yazar sonra onunla ilgilenmez.yani o verilere tekrar ulaşamazsınız.SD modül temin ederek(ucuzdurlar kendileri) pc ile uğraşmadan kayıtları bir txt içine yazar.RTC ile yaparsanız saat tarihte eklersiniz.
  • Arduino verileri seri porta atıyor. ben onları kopyalayıp excelden grafik haline getiriyordum. Ancak sabaha kadarda çalışsa arduino. Ben tüm gece seri porta biriken verilere ulaşmak istersem sadece 500000 adet alınan veriyi kopyalayıp işlem yapabiliyorum. "msg" isimli arkadaşımın önerisi üzerine C# kurdum ve üzerinde çalışıyorum.. Sizin önerinizi dikkate alacağım. SD kart modülü temin edip denemeler yapabilirim istediğim tadirde verilerle yeniden işleme yapabilirim. Peki SD modülü ne kadarlık bir veri hızına sahip gecikmeler oluyor mu ? Yani anlık olarak göremesem de verileri, sonrasında kontrol ettiğimde kaydedilmeyen veriler olur mu ?
    Herhangi bir delay komutu vermiyorum baud 9600 hızıyla gönderilen sensör verileri olucak.. ?
  • sd karta cok hızlı verıyazabılırsınız seriden hızlı olur daha sonra yıne bılgılerı sd karttan okutup seriporttan yollarsınız veya sd kartı bılgısayara takıp incelersınız.
  • Bu güzel haber. Sd karta yoğunlaşmalıyım sanırım.
    8gb belki daha fazla kapasiteli kartı okuması için, fat16 gibi bir bilgi gördüm bu tam anlamıyla ne demek oluyor.. ?
  • fat32 formatlı kullanmaya çalışın. hd kapasıtelerı arttıkça dosya sıstemlerı de gelişti.
  • Pc ye kayıt yapacaksan Plx-daq işini görür.
  • Arkadaşlar merhaba
    Bir adet mikro-SD kart modülü temin edip, ısı sensörünü 4GB kapasieli karta yazdırdım. Sorunsuz çalıştı. Denemelerim hep 1dk 2dk süreleri ile sınırlıydı. Ancak arduinoyu 9 V'luk pil ile yaklaşık 9 saat bilgisayardan bağlantısız çalıştırdım. 9 saat sonucunda kartı bilgisayara takıp kontrol ettiğimde karta ulaşamadım. kart içerisinde txt dosyasını görüyorum fakat açamıyorum. İşin kötü tarafı şu ki ? Biçimlendirme format check-disk gibi hiçbir işlem çalışmıyor. Kartı Modülden okuttuğumda kart düzgün çalışıyor gibi görülüyor. Ama verilere ulaşamayıp kartı biçimlendiremiyorum.. Yeni bir kart almayı düşünüyorum ancak yine aynı sorun olur mu bilemiyorum. Henüz sorunu bile çözemedim.. Bu konuda deneyimi olan yada fikri olan paylaşabilir mi lütfen ?
  • fdisk denedinizmi
  • evet denedim 'başarısız oldu' açıklaması getiriyor.
    hafıza kartı diskinin ismi ''Hfz. kartE'' gibi saçma bir isimle kaldı.. ad değişim Disk yönetiminden biçimlendirmede yapamıyorum.. modülün kartı bozma ihtimali var mı ki ?
  • o ihtimal var, ama 1 kart daha deneyin derim. bu arada verileri nekadar sıklıkla alıyosunuz?
    ;
    EDIT 1:
    bu arada ilk yöntem arduino serial monitorde biriktirip kopyalayıp excele atıp grafiğe dönuşturuyorsun?

    yerine direk excel vba kodlamasına girip ister mscomm ocx ini ekleyip onun uzerinden basitce birkaç satır kodla veya istersen aşağıdaki yöntemi uygulayıp direk arduinodan gelen bilgiyi tabloya kayıt edip grafiğinide alabilirsin.
    http://dev.emcelettronica.com/serial-port-communication-in-excel-vba

    EDIT 2:
    keşke her soru sizinki gibi olsa forumun başından ayrılmam :) aklıma bir yontem daha geldi yazayım dedim

    eğer ortamda internet varsa "cayenne" diye bi servis var(MQTT), sitesine kayıt oluyor, arduinoyada sana verdigi kodları atıyorsun. uzerine ethernet shieldi ekleyip keyfine bakıyosun. kendi arayuzunde grafik flnde var
  • Yorumlar ve cevaplar için çok teşekkür ederim.. :)
    Ya aslına bakarsanız çok iç açıcı çözümler getirmişsiniz. Ancak bu exceldeki sistemi çözebilmem çok uzun zaman alır. Hiç hakim değilim ilk defa duydum diyebilirim. Arduino ile internetten uzak noktalarda datalar toplayacağım. Yani çok basit aslında ısı sensörü ve sd karta kayıt. Bu kadar ama nedense her iş ters gidiyor... Çalışan sistem bir süre açık kalınca bozuluyor. Tam hata da göstermiyor sadece arızalı oluyor filan.
    Pil ile çalıştırdığım için 9 saat sonunda gücü azalıp bir sıkıntı oluşmuş olabilir mi ? Karta yazma sırasında güç yetersizliği gibi filan. Yada kartı sık takıp çıkarmak böyle hatalara sebep verir mi ?
  • Şu ısı sensörünün verisini okuyup comport üzerinden gönderen kodu bi gönderebilirmisin.. neler yapabiliriz bi bakalım derim..

  • Az önce paylaştığınız link ile birlikte Excel deki Com bağlantısını denedim ve porttan aldığı veriyi excelde yazdırdı.. Ama Excele kurulması istenen bir eklenti gibi birşey var o demo olduğundan dolayı ara sıra uyarı veriyor datanın bölünmesine ve müdehale etmeye gereksinim duyuyor. Bu sistem barkod okuyucu gibi sistemler ile sorunsuz çalışılabiliyor sanırım. çünkü barkod sistemi zaten sürekli sizin müdehaleniz ile çalıştığından uyarıya close diyip sorunsuz devam edebiliyorsunuz.. Paylaşım için teşekkür ederim oldukça kullanışlı bir sistemmiş..
    SD kart modülü çalışmış olsaydı txt datalarını sorunsuz işlemeye sokabilirdim matlab ilede verileri grafik haline getirmek kolay olurdu. Yeter ki SD karta kayıt yapabileyim ..

    Kod şu;

    #include < OneWire.h>
    #include < DallasTemperature.h>
    #include < Wire.h>


    #define ONE_WIRE_BUS 2
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);

    DeviceAddress Sump;

    int heaterpin = 10, alkpin = 12, calpin = 13, ato = 11, alarmpin = 8; //digital outputs
    int PH_READ_PIN = A0; //analog inputs


    float tempmax, tempmin;
    float sump, PH;
    int alkml, calml;
    float alksp, calsp;
    float lowtempsp, hightempsp, Mlowtempsp;
    byte menustate = 0, alarmstate = 0, alarmmenureset = 0,menureset = 0;
    int Ealksp = 0;
    int Ecalsp = 0;
    int Rcalsp;
    int Ralksp;
    int Elowtempsp = 2;
    int lowtempspstart;
    int Wlowtempsp;
    boolean alkcheck = false, calcheck = false;
    int CAL, ALK;
    const float pumpspeed = (float)60 / (float)1.1;
    boolean hitemp = false,lowtemp = false, hilevel = false, checkfloats = false, lowfloatfault = false, highfloatfault = false;
    void setup(void)
    {
    Serial.begin(9600);

    sensors.begin();
    (!sensors.getAddress(Sump, 0));
    sensors.setResolution(Sump, 11);



    lowtempsp = lowtempspstart / (float)100;


    //timer.setInterval(360000000, hourpulse);

    alkml = alksp * pumpspeed;
    calml = calsp * pumpspeed;
    tempmax = 78;
    tempmin = 78;
    Serial.begin(9600);

    }

    void alarms()
    {
    if (sump > 82) hitemp = true;
    if (sump < 76) lowtemp = true;


    if (alarmmenureset >= 2) alarmstate++, alarmmenureset = 0;
    if (alarmstate >= 6) alarmstate = 0;
    if (menustate == 0)
    {

    hitemp = false;
    lowtemp = false;
    hilevel = false;
    checkfloats = false;
    lowfloatfault = false;
    highfloatfault = false;

    }
    }




    void printTemperature(DeviceAddress deviceAddress)
    {

    hightempsp = (lowtempsp + 00.10);
    sump = sensors.getTempF(deviceAddress);
    if ((sump < lowtempsp) && (sump > 45)) digitalWrite(heaterpin, HIGH);
    if (sump > hightempsp) digitalWrite(heaterpin, LOW);
    if (sump > tempmax) tempmax = sump;
    if (sump < tempmin) tempmin = sump;

    }


    void loop(void)
    {
    Serial.print(sump);
    Serial.println();
    alarms();
    delay(5000);
    //getPH();

    sensors.requestTemperatures(); // Send the command to get temperatures
    printTemperature(Sump); // Use a simple function to print out the data
    }

    ************************************************************************************************************************************************************************************


    SD kart modülü ile denediğim kod da şuydu ;


    #include
    #include
    File myFile;
    int sdCardPin = 4;
    int temperatureProbePin = 2;
    int greenLEDPin = 5;
    int redLEDPin = 6;
    int pauseBetweenReadings = 5000; // in milliseconds
    int timeForLitLED = 1000;
    uint32_t startTime;
    int probeErrorCode = -1000;
    OneWire ds(temperatureProbePin);
    void setup() {
    pinMode(sdCardPin, OUTPUT);
    pinMode(greenLEDPin, OUTPUT);
    pinMode(redLEDPin, OUTPUT);

    startTime = millis();
    Serial.begin(9600);

    // SET UP SD CARD FOR WRITING
    if (!SD.begin(sdCardPin)) {
    Serial.println("initialization failed!");
    return;
    } else {
    Serial.println("SD card initialized");
    myFile = SD.open("data.txt", FILE_WRITE); // open file for writing
    if (myFile) { // if file can be opened, write to it
    myFile.print("temperature");
    Serial.print("temper.txt file opened for writing");
    myFile.close();
    } else { // if not, show an error
    Serial.println("ERROR: not able to open temperature.txt");
    }
    }
    }
    void loop() {
    uint32_t timeNow = (millis() - startTime)/1000;
    float temperature = getTemp();

    if (temperature != probeErrorCode) {
    writeDataToCard(timeNow, temperature);
    digitalWrite(greenLEDPin, HIGH);
    } else {
    digitalWrite(redLEDPin, HIGH);
    }

    delay(timeForLitLED);
    digitalWrite(redLEDPin, LOW);
    digitalWrite(greenLEDPin, LOW);

    delay(pauseBetweenReadings-timeForLitLED);
    }
    float getTemp() {
    byte data[12];
    byte addr[8];

    if ( !ds.search(addr)) {
    //no more sensors on chain, reset search
    ds.reset_search();
    return -1000;
    }

    if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return -1000;
    }

    if ( addr[0] != 0x10 && addr[0] != 0x28) {
    Serial.print("Device is not recognized");
    return -1000;
    }

    ds.reset();
    ds.select(addr);
    ds.write(0x44,1);

    byte present = ds.reset();
    ds.select(addr);
    ds.write(0xBE);

    for (int i = 0; i < 9; i++) {
    data[i] = ds.read();
    }

    ds.reset_search();

    int LowByte = data[0];
    int HighByte = data[1];

    float TRead = (HighByte << 8) + LowByte;<br /> float Temperature = TRead / 16;

    return Temperature;
    }
    void writeDataToCard(uint32_t time, float temperature) {
    myFile = SD.open("temper.txt", FILE_WRITE);


    myFile.println(temperature);

    myFile.close();
    }

    İlginize teşekkür ederim.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.