Close

Posílání dat do mysql databáze

Úvodní stránka Fórum Hardware Arduino Posílání dat do mysql databáze

Aktuálně je na stránce zobrazeno 10 příspěvků - 1. až 10. (celkem z 10)
  • Autor
    Příspěvky
  • #5090
    novakkry
    Účastník

    Ahoj, nedávno jsem pořídil arduino uno, takže jsem úplný začátečník, ale nadšený a plný odhodlání. :))

    Chtěl bych si vyrobit přístroj, který bude měřit hladinu vody a teplotu vzduchu a posílat to do mysql databáze na server jednou za den, ale moc nevím, jak přinutit arduino a tak se na vás s prosbou obracím.

    Koupil jsem si a úspěšně zprovoznil ultrasonic senzor na měření vzdálenosti a SIM800l modul (http://cdn1.shopium.ua/d/arduino/c/s/6c414f36-bb29-4bc3-9a61-44bb3be1e79b.jpg), který se mi také podařil zprovoznit, bohužel ale jenom na posílání SMS.

    Na jednom webu na internetu (http://arduinodev.com/arduino-library-for-gprshttp-communication-with-sim800/) jsem našel návod na podobný problém, ale kód se mi nepodařilo zprovoznit. V odkazu na GitHubu na knihovnu zmiňuje, že je potřeba pro úspěšné zprovoznění knihovny cituji: „Change SIM_SERIAL definition to the serial UART which SIM800 is attached to“. Úplně si nejsem jistý, co si pod tím představit. Co mám konrétně změnit a v jakém souboru? Pomohl by mi s tím prosím někdo?
    SIM 800 mám připojený např.
    TX pin 6
    RX pin 7
    Příklad adresy, která přidá do mysql databáze výšku hladiny 50cm a teplotu 20 celsia: 10.10.10.10:80/pridat.php?hladina=50&teplota20

    Děkuji moc

    Kryštof

    #5171
    Vojtěch Vosáhlo
    Účastník

    Ahoj,
    Jak jsem se dočetl tak sis pořídil SIM800L který se umí k internetu připojit přes GPRS.
    1. Problém který by si mohl mít je aktivace dat na sim kartě. Pokud karta nemá zaplacená mobilní data tak není možné aby to fungovalo.
    Viz. dokumentace:

    GPRS založená na technologii přepojování paketů využívá volné časové sloty, které může sdílet více uživatelů, a je účtována za přenesená data nebo paušálem za určité časové období

    Další věc která mě zaujala je že píšeš TX pin 6, RX pin 7
    Arduino (pokud nepoužíváš system serial) má pro seriovou komunikaci pin 0 a 1
    Vysvětlení téhle věty:

    Change SIM_SERIAL definition to the serial UART which SIM800 is attached to

    je úplně jednoduché. To co po tobě chtějí je definovat jaký UART používáš.

    Mělo by stačit do tvého kódu vložit #define SIM_SERIAL Serial
    pokud budeš používat nativní seriový port arduina. Pokud budeš používat Software serial tak tam místo Serial dáš jméno toho tvého virtuálního sériového portu.
    Hodně štěstí a kdyžtak se ještě ozvi.

    #5278
    novakkry
    Účastník

    Vojto, díky moc za odpověď, nakonec jsem to dal dohromady. :)) Po nastavení na „serial“ a přepojejní na piny 0 a 1 to funguje. Resp. se musí zapojit TX na RX a RX na TX – nevím proč. Promiň, že odepisuju po tak dlouhý době, byl jsem pryč.

    Potřebuju překonat ještě jeden problém, možná trochu větší… Chci, aby arduino tu informaci posílalo jednou za den. Bude poměrně na opuštěném místě, tak potřebuji, aby vydrželo aspoň rok na baterku. Jelikož mi stačí, aby bylo v činnosti max minutu denně, tak by to snad neměl být problém.
    Koupil jsem RTC modul ds3231 a mým cílem je, aby arduino spalo, DS3231 ho v určitý čas probudil, arduino by udělalo měření a poslalo by data na server a zase uslo. Takhle furt dokola. Už se to snažím dva dny zprovoznit a výsledek naprosto žádnej.

    Na této stránce (zhruba v první třetině) pod nadpisem „waking from sleep with signal“ je docela pěkný kód, který bych možná chtěl použít, ale není v něm zaimplementováno DS3231.
    http://gammon.com.au/power

    Tady JChristensen, který napsal knihovnu DS3231.h postoval kód, který má nastaven alarm a interrupt na určitý čas. Zprovoznil jsem ho, ale nemá v sobě „sleep“ funkci a za boha jí tam neumím dodat.
    https://github.com/JChristensen/DS3232RTC/issues/5

    Už se o to snažím dva dny a výsledek pořád žádnej, jsem z toho už fakt zoufalej… :/
    Jde mi opravdu jenom o to, aby arduino spalo a v určitej čas ho ds3231 probudilo a arduino udělalo nějakou úlohu a zase uslo. Podle všeho, co jsem se dočetl na netu, by to mělo bejt fakt jednoduchý, ale prostě já nejsem schopnej to zprovoznit.

    Kdyby mi někdo pomohl, byl bych opravdu neskutečně vděčnej.

    Díky moc

    Kryštof

    #5280
    Vojtěch Vosáhlo
    Účastník

    Ahoj,
    upřímně bych nepoužíval arduino samotné k tomu aby se budilo. Nevím kolik mA ti arduino bere ale alespoň 1mA i při spánku to bude. Já bych zainvestoval nějakých 30Kč 😀 a koupil si Attiny13A. Tenhle procesor používám hrozně dlouho a na buzení ostatních zařízení je dokonalý. Má spotřebu 190uA při práci a 24uA při spánku což by ti např. s 2000 mAh baterijí vydrželo asi 3000dní (i když počítám se sepnutím arduina, měřením…)
    Být tebou bych udělal tohle:

        Nastav si v DS3231 alarm. Ten dovolí aby ti DS každý den (nebo jakýkoliv interval co nastavíš) poslal data o čase.
        Napsat program který s využitím interuptů zbudí attiny13 když DS pošle data.
        Attiny zapne na určitý čas arduino.
        Arduino si přeměří všechny data, pokud je potřeba přečte si čas z DS a odešle vše na web.
        Poté Attiny znovu vypne arduino a uspí se. To se opakuje pořád dokola.

    Takhle bych to udělal já ale chápu že to je docela komplikované. Zvaž všechny pro a proti a kdyby ti to nevyhovovalo tak napiš a vymyslíme něco jiného.
    Hodně štěstí.
    Mimochodem RX na TX a TX na RX je standardní zapojení sériové linky. Funguje to tak že 1. zařízení něco odešle ze svého TX (transmit) pinu a tyhle data musí 2. zařízení přijmout svým RX (receive) pinem.

    Doufám že to pomůže. 😀

    #5284
    novakkry
    Účastník

    No já bych nepoužíval arduino na samotné buzení. Postavil bych si bareduino (bez všech regulátorů, ledek a těchto zbytečností) a budil bych ho přes ten rtc ds3231 modul. Ten má na sobě atmel 24c32n a běží na vlastní baterce, takže arduino může spát a mít spotřebu v micro amperech.
    Na internetu jsou k tomu tuny návodů, ale já jsem prostě takový kopyto, že to neumím zprovoznit… 🙁

    #5285
    novakkry
    Účastník

    Jinak díky moc za objasnění TX a RX. To jsou takový malý věci, který člověk neví, zaberou mi celej den a potom člověk zjistí, že má přehodit jenom dva drátky… 😀

    #5286
    Vojtěch Vosáhlo
    Účastník

    To jsou takový malý věci, který člověk neví, zaberou mi celej den a potom člověk zjistí, že má přehodit jenom dva drátky…

    Já jsem s tím měl jako začátečník taky problémy.

    Hele dnes už nemám čas ale zítra to dořešíme, zkusím ti to pomoct sprovoznit. 😀

    #5287
    novakkry
    Účastník

    To by bylo žůžo. Díkes! 😀

    #5288
    novakkry
    Účastník

    Tady je můj kód, kterej jsem poslepoval z nějakejch kódů. Je to zatím asi nejdál, co jsem se dostal. 😀
    Problém je, že proběhne loop, potom se to uspí, probudí, uspí, ale už neprobudí. :/ Možná ten kód je blbost, já nevím…

    #include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
    #include <Streaming.h>        //http://arduiniana.org/libraries/streaming/
    #include <Time.h>             //https://playground.arduino.cc/Code/Time
    #include <Wire.h>             //https://arduino.cc/en/Reference/Wire
    #include <avr/sleep.h>                                 
    
    #define SQW_PIN 2
    
    void setup(void)
    {
        Serial.begin(115200);
    
        //setSyncProvider() causes the Time library to synchronize with the
        //external RTC by calling RTC.get() every five minutes by default.
        setSyncProvider(RTC.get);
        Serial << "RTC Sync";
        if (timeStatus() != timeSet){
            Serial << " FAIL!";
        }
        Serial << endl;
    
        printDateTime( RTC.get() );
        Serial << " --> Current RTC time." << endl;
    
        //Disable the default square wave of the SQW pin.
        RTC.squareWave(SQWAVE_NONE);
    
        //Attach an interrupt on the falling of the SQW pin.
        //digitalWrite(SQW_PIN, HIGH);    //redundant with the following line
        pinMode(SQW_PIN, INPUT_PULLUP);
        
    
        //Set an alarm at every 20th second of every minute.
        RTC.setAlarm(ALM1_MATCH_SECONDS, 20, 0, 0, 1);    //daydate parameter should be between 1 and 7
        RTC.alarm(ALARM_1);                   //ensure RTC interrupt flag is cleared
        RTC.alarmInterrupt(ALARM_1, true);
    
    }
    
    //volatile boolean alarmIsrWasCalled = false; myslim, ze to nepotrebujeme
    
    void alarmIsr()
    {
        Serial.println("alarmIsr"); //abych zjistil, jestli tahle funce byla zavolana
       // alarmIsrWasCalled = true; myslim, ze to nepotrebujeme
    
    }
    
    void sleepNow() {  
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // sleep mode is set here  
        sleep_enable();                         // enables the sleep bit in the mcucr register  
          // use interrupt 0 (pin 2) and run function 
          attachInterrupt(0,alarmIsr, CHANGE);// here the device is actually put to sleep!!   
          sleep_mode(); 
          Serial.println("SleepNow"); //abych zjistil, jestli tahle funce byla zavolana
          
        // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP  
       
    
      //  sleep_disable();         // first thing after waking from sleep: disable sleep...  
       // detachInterrupt(0);      // disables interrupt 0 on pin 2 so the wakeUpNow code will not be executed during normal running time.  
    }  
    
    int i = 1; //abych zjistil, kolikrat probehl loop
    
    void loop(void)
    {
    // alarmIsrWasCalled = false; myslim, ze to nepotrebujeme
    delay(100);
    Serial.println(i);
    delay(100);
    i++;
    sleepNow();
    }
    
    void printDateTime(time_t t)
    {
        Serial << ((day(t)<10) ? "0" : "") << _DEC(day(t)) << ' ';
        Serial << monthShortStr(month(t)) << " " << _DEC(year(t)) << ' ';
        Serial << ((hour(t)<10) ? "0" : "") << _DEC(hour(t)) << ':';
        Serial << ((minute(t)<10) ? "0" : "") << _DEC(minute(t)) << ':';
        Serial << ((second(t)<10) ? "0" : "") << _DEC(second(t));
    }
    #5294
    Vojtěch Vosáhlo
    Účastník

    Tak jo. Chvíli jsem na tom pracoval a už to funguje. Tvůj problém byl nejspíše v tom že DS posílá data tak rychle že se procesor přehltí a zasekne se. Tady je kód který jsem použil na testování. Doplň si do něj vše co používáš na daná místa a pak ho zkus spustit.

    //#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
    //#include <Streaming.h>        //http://arduiniana.org/libraries/streaming/
    //#include <Time.h>             //https://playground.arduino.cc/Code/Time
    #include <Wire.h>             //https://arduino.cc/en/Reference/Wire
    #include <avr/sleep.h>                                 
    
    #define SQW_PIN 2
    boolean sleep = false;
    
    void setup(void)
    {
        Serial.begin(115200);
        
        //setSyncProvider() causes the Time library to synchronize with the
        //external RTC by calling RTC.get() every five minutes by default.
       /* setSyncProvider(RTC.get);
        Serial << "RTC Sync";
        if (timeStatus() != timeSet){
            Serial << " FAIL!";
        }
        Serial << endl;
    
        printDateTime( RTC.get() );
        Serial << " --> Current RTC time." << endl;
    
        //Disable the default square wave of the SQW pin.
        RTC.squareWave(SQWAVE_NONE);
    
        //Attach an interrupt on the falling of the SQW pin.
        //digitalWrite(SQW_PIN, HIGH);    //redundant with the following line*/
        pinMode(SQW_PIN, INPUT_PULLUP);
        
    
        //Set an alarm at every 20th second of every minute.
      /*  RTC.setAlarm(ALM1_MATCH_SECONDS, 20, 0, 0, 1);    //daydate parameter should be between 1 and 7
        RTC.alarm(ALARM_1);                   //ensure RTC interrupt flag is cleared
        RTC.alarmInterrupt(ALARM_1, true);*/
    
    }
    
    //volatile boolean alarmIsrWasCalled = false; myslim, ze to nepotrebujeme
    
    void alarmIsr()
    {
        
        sleep_disable();
        sleep = false;
        Serial.println("Probudil jsem se!");
        detachInterrupt(0);
        
    }
    
    void sleepNow() {  
        sleep_enable();
        sleep = true;
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // sleep mode is set here 
        
        attachInterrupt(0, alarmIsr, CHANGE);
        sleep_mode(); 
        
     
    
        if(sleep) sleep_disable();         
        Serial.println("Muj kod...");
        delay(1000); ///!!!!!!!!!!!!!!!DULEZITE!!!!!!!!!!!!
       
    
       
       
    }  
    
    int i = 1; //abych zjistil, kolikrat probehl loop
    
    void loop(void)
    {
    // alarmIsrWasCalled = false; myslim, ze to nepotrebujeme
    delay(100);
    Serial.println(i);
    printDateTime();
    delay(100);
    i++;
    sleepNow();
    }
    
    void printDateTime(/*time_t t*/)
    {
        /*Serial << ((day(t)<10) ? "0" : "") << _DEC(day(t)) << ' ';
        Serial << monthShortStr(month(t)) << " " << _DEC(year(t)) << ' ';
        Serial << ((hour(t)<10) ? "0" : "") << _DEC(hour(t)) << ':';
        Serial << ((minute(t)<10) ? "0" : "") << _DEC(minute(t)) << ':';
        Serial << ((second(t)<10) ? "0" : "") << _DEC(second(t));*/
    
        Serial.println("Vypis cas.");
    }

    Mělo by to fungovat tak že když se na interupt pinu něco změní – DS pošle data
    tak se dostaneš do smyčka alarmIsr() —> zpět do sleepNow() na pozici „Můj kód…“ —> loop() —> výpis času printDateTime() a zpět na sleepNow()

    Takhle to jde pořád dokola. Zkus to a napiš jak to funguje. 😀

Aktuálně je na stránce zobrazeno 10 příspěvků - 1. až 10. (celkem z 10)
  • Pro reakci na toto téma se musíte přihlásit.