dht11 tweet atarken küçük bir sorun
  • Merhaba arkadaşlar,

    void loop () {

    int chk = DHT11.read(DHT11PIN);
    int sicaklik=((float)DHT11.temperature, 0);
    Serial.println((float)DHT11.temperature, 0);
    delay(1000);
    //Serial.println("Baglanti kuruluyor");
    ether.packetLoop(ether.packetReceive());
    const char* reply = ether.tcpReply(session);
    if (reply != 0) {

    Serial.println(reply);
    }
    if(sicaklik > 24){
    TweetAt();
    }
    }

    Yukardaki kod ile dht11 den okunan ısı değerini kontrol edip 24 derecenin üstüne çıktığı anda TweetAt() fonksiyonu devreye girsin istiyorum fakat, serial monitörde sürekli ısı değerini alt alta yazdığını görüyorum. Hiç bir şekilde if bloğuna geçiremedim kodları. Yardımcı olursanız sevinirim.
  • 24 derecenin üstüne çıktığı anda TweetAt() fonksiyonu kodlarında sıkıntı yok gibi sicaklik değişkeninizde 24 ten büyük değer oluyor mu serial monitörde onu gözlemleyin

    Serial.println(sicaklik);

  • sensörü parmağımla sıktıktan bir süre sonra monitörde 25-26 dereceleri görüyorum.
  • Evet ama ustteki kodlara gore Serial.println((float)DHT11.temperature, 0); ile dogrudan sensordeki veriyi yazdiriyorsunuz
    Serial.println(sicaklik); ile yazdirmayi deneyin belki degişkene atanırken sorun oluyordur
    Eğer buna rağmen doğru veri okunursa o zaman koşul da çalışıyordur fonksionda sorun vardır koşulu da test etmeniz için

    if(sicaklik > 24){
    Serial.println("kosul dogru");
    TweetAt();
    }
    Deneyin adım adım giderseniz sorunu bulabilirsiniz
  • float t = dht.readTemperature();
    Serial.println(t,0);
    delay(1000);
    //Serial.println("Baglanti kuruluyor");
    if(t > 24){
    Serial.println("koşul doğru");
    TweetAt();
    delay(6000);

    hocam loop yapısını bu şekilde değiştirdim.Sıcaklık 24 derecenin üzerine çıkınca serial monitör aşağıdaki gibi görünüyor. Fakat bu seferde tweet gönderildi yazmasına rağmen bakıyorum tweet atmamış cihaz. TweetAt() fonksiyonu if yapısı olmadan sorunsuz çalışıyor. Burda neden çalışmadı anlamadım.

    ----------------------serial monönitör çıktısı---------------------------
    IP: 192.168.50.21
    GW: 192.168.48.1
    DNS: 192.168.48.5
    SRV: 172.217.169.116
    nan
    nan
    24
    24
    24
    24
    24
    24
    24
    24
    24
    24
    25
    koşul doğru
    Tweet hazirlaniyor

    Tweet hazirlandi
    Tweet yollandi

    --------------------------------TweetAt fonksiyonu-----------------------
    static void TweetAt () {
    Serial.println("Tweet hazirlaniyor");

    Serial.println();
    // Sensörün okunup okunmadığını konrol ediyoruz.
    // chk 0 ise sorunsuz okunuyor demektir. Sorun yaşarsanız
    // chk değerini serial monitörde yazdırıp kontrol edebilirsiniz.
    float t = dht.readTemperature();
    float h = dht.readHumidity();

    // Sensörden gelen verileri serial monitörde yazdırıyoruz.

    //int sicaklik = analogRead(A0);
    /* A0daki gerilim ölçüldü */
    //sicaklik = sicaklik * 0.48828125;
    /* Ölçülen gerilim sicaklığa çevrildi */

    byte sd = stash.create();
    stash.print("token=");
    stash.print(TOKEN);
    stash.print("&status=");
    stash.print("@gknsen88 Sistem odasi sicakligi su anda ");
    stash.print("Sicaklik (°C): ");
    stash.println(t, 0);
    stash.print("Nem (%): ");
    stash.println(h, 0);

    Serial.println("Tweet hazirlandi");

    stash.save();
    int stash_size = stash.size();
    Stash::prepare(PSTR("POST http://$F/update HTTP/1.0" "\r\n"
    "Host: $F" "\r\n"
    "Content-Length: $D" "\r\n"
    "\r\n"
    "$H"),
    website, website, stash_size, sd);
    session = ether.tcpSend();
    Serial.println("Tweet yollandi");
    }
  • TweetAt() fonksiyonu if yapısı olmadan sorunsuz çalışıyor dediğinize göre tekrar etmesi sorun olabilir

    TweetAt fonksiyonu tekrar etmesi serial monönitör çıktısından da belli 24 24 24 24 diye sıralamış kodların taşmasına neden oluyor olabilir şöyle bir mantık kullanın kodların başında yeni bir değişken tanımlayın

    boolean onay = false;
    sonra sicaklik > 24 dediğiniz koşulda bunu

    if(sicaklik > 24 && onay == false){ // eger sicaklik 24 ten buyuk ve onay false ise
    TweetAt fonksiyonu çağırın ve
    onay = true; olarak değiştirin tekrar etmesin

    daha sonra bir koşul daha yaparak sicaklik küçükse 24 ten tekrar onay = false yapın bir dahaki sıcaklık 24 de ulaştığında koşul yenden sağlanabilsin
  • twiti bir kere atacaksınız bunun için bır ek değişkene daha ıhtıyacınız var sıcaklık bir kere 24 u aştıgında arka arkaya tonla tıwit atacaktır bu da twıtter tarafında ıstenen bır şey değil bu twit sıklığını da kontrol etmenız lazım.
  • float t = dht.readTemperature();
    Serial.println(t,0);
    delay(1000);
    //Serial.println("Baglanti kuruluyor");
    if(t > 24 && onay == false){
    Serial.println("koşul doğru");
    TweetAt();
    onay=true;
    delay(60000);

    Dediğn gibi kodların başına boolean onay; yazdım ve if yapısını bu şekilde değiştirdim. Serial monitör çıktısı yine aynı malesef tweet atmadı.

    "24 24 24 24 diye sıralamış kodların taşmasına neden oluyor olabilir"

    burda bir taşma olduğunu sanmıyorum çünkü ısı değerini 1 sn de bir okuyup alt alta yazdırıyorum.
  • bu arada kodlarda gözüme çarpan başka bir konu daha var delay 60000 çok büyük bir sayı int olduğu için -32,768 ile 32,767 arası kullanılabilir diye biliyorum delay için bu geçerli mi bilmiyorum ama bu sebepten dolayı 32snye aralıklarla işlerse twiter buna engel olur düşüncesindeyim long kullanarak millis ile yapmaya çalışın.

    unsigned long oncekiZaman = 0;

    if (millis() - oncekiZaman > 60000 && t > 24 && onay == false) {
    TweetAt();
    onay=true;
    oncekiZaman = millis();
    }

  • Hocam bu sefer tweetat() fonksiyonuna hiç geçmedi. Sürekli Isı değerlerini alt alta yazdı
  • .
    .
    .
    .
    .
    24
    24
    24
    24
    25
    koşul doğru
    Tweet hazirlaniyor

    Tweet hazirlandi
    Tweet yollandi

    Hocam çok pardon seri monitör açıkken 1 dk bekledikten sonra yuakrdaki çıktıyı verdi fakat yine atılan bir tweet yok ortada.
  • evet zaten dakikada bir tweet atsın diye yaptık millis kontrolünü (twiter kim bu kapıyı durmadan vuruyor demesin diye) şimdi dakikada bir işlemi tamam demekki ama tweet gitmedi bu durumda ya tweetat() fonksiyonu tweet atmıyor yani koşul ile alakalı değil fakat siz if koşulu olmadan doğru çalışıyor demiştiniz bu durumda aklıma tek gelen twitter tarafından çok sık denemeler yaptığınız için IP veya kullanıcıya engel atılmış olması bu durumda bir süre sonra yeniden denemeniz gerekecek
  • tweetat fonksiyonu çalışıyor hocam tekrar denedim hiç bir sorun yok. Tek sorun tweetat fonksiyonunu koşula bağlayınca atmıyor. ;/
  • http://maker.robotistan.com/esp8266-dersleri-4-oda-sicakligini-tweet-atma/

    arkadaşlar merhaba ilk projeden vazgeçtim :D linkteki benzer projeye başladım. Linkteki makalede wifi modülü üzerinden anlatılmış. Ben bunu erthernet modüle uyarlamaya çalıştım fakat yine başarılı olamadım. Aşağıya arduino kodlarımı ve seri monitör çıktısını yazıyorum.Yardımcı olursan sevinirim.

    #include < EtherCard.h>
    #include < DHT.h> // dht11 kütüphanesini ekliyoruz.
    #define DHTPIN 2 // DHT11PIN olarak Dijital 2"yi belirliyoruz.
    #define DHTTYPE DHT11
    #define IP "184.106.153.149"
    DHT dht(DHTPIN, DHTTYPE);
    static uint32_t timer;
    float t=0;
    byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
    /* tekil MAC adresi */

    const char website[] PROGMEM = "arduino-tweet.appspot.com";
    /* Tweet atabilmemiz için kullandığımız uygulama adresi */

    static byte session;

    byte Ethernet::buffer[700];
    Stash stash;

    void sicaklik_yolla(){
    Serial.println(String("AT+CIPSTART=\"TCP\",\"") + IP + "\",80"); //thingspeak sunucusuna bağlanmak için bu kodu kullanıyoruz.
    //AT+CIPSTART komutu ile sunucuya bağlanmak için sunucudan izin istiyoruz.
    //TCP burada yapacağımız bağlantı çeşidini gösteriyor. 80 ise bağlanacağımız portu gösteriyor
    delay(1500);
    String tweet = "POST /apps/thingtweet/1/statuses/update HTTP/1.1\n";
    tweet+="Host: api.thingspeak.com\n";
    tweet+="Connection: close\n";
    tweet+="Content-Type: application/x-www-form-urlencoded\n";
    tweet+="Content-Length:50\r\n\r\napi_key=";
    tweet+=String("6N1DBEM945M3WP2R"); //ThingSpeak'den aldığımız Twitter API KEY'ini buraya yazıyoruz.
    tweet+=String("&status=");
    tweet+=String("Cok Sicak #esp8266"); // Yollamak istediğimiz tweeti buraya yazıyoruz.

    Serial.print("AT+CIPSEND="); //veri yollayacağımız zaman bu komutu kullanıyoruz. Bu komut ile önce kaç tane karakter yollayacağımızı söylememiz gerekiyor.
    delay(100);
    Serial.println(tweet.length());

    if(Serial.find(">")){ //eğer sunucu ile iletişim sağlayıp komut uzunluğunu gönderebilmişsek ESP modülü bize ">" işareti ile geri dönüyor.
    // arduino da ">" işaretini gördüğü anda sıcaklık verisini esp modülü ile thingspeak sunucusuna yolluyor.
    Serial.println(tweet);
    Serial.println("AT+CIPCLOSE=0");
    delay(100);

    }
    else{
    Serial.println("AT+CIPCLOSE=0");
    }
    }

    void setup () {
    Serial.begin(9600);
    Serial.println("AT");
    delay(1000);
    if(Serial.find("OK")){
    if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println(F("Ethernet baglanti hatasi"));
    if (!ether.dhcpSetup())
    Serial.println(F("DHCP hatasi"));

    ether.printIp("IP: ", ether.myip);
    ether.printIp("GW: ", ether.gwip);
    ether.printIp("DNS: ", ether.dnsip);

    if (!ether.dnsLookup(website))
    Serial.println(F("DNS hatasi"));
    ether.printIp("SRV: ", ether.hisip);
    }
    }

    void loop () {
    /*ether.packetLoop(ether.packetReceive());

    const char* reply = ether.tcpReply(session);
    if (reply != 0) {

    Serial.println(reply);
    }*/

    float sicaklik = dht.readTemperature();
    Serial.println(sicaklik, 0);
    delay(1000);
    if(sicaklik > 24){
    sicaklik_yolla();
    delay(60000);
    }


    }

    //////////////////////////seri monitör///////////////////////////////////

    23
    23
    23
    23
    24
    24
    24
    24
    25
    AT+CIPSTART="TCP","184.106.153.149",80
    AT+CIPSEND=169
    AT+CIPCLOSE=0
  • linkteki projeyi birebir yapıp çalıştırın önce.
  • hocam linkteki proje wifi modülü ile yapılmış.Elimde wifi modülü yok o yüzden ethernet modül ile yapmak istiyorum.
  • tweetat fonksiyonundan neden vazgeçtiniz ki? tweetat çalışıyor dediniz yani koşul dışında deneyince nasıl denediniz doğrudan fonksiyon kodlarını loop içinde mi?
    eğer öyleyse kodlarda fonksiyon içinde çalışmayan birşeyler olabilir başka sorun da görünmüyor gibi tek sorun fonksiyonu koşula bağladığınızda bunu fonksiyon yerine bir şarta atayıp loop içinde deneyebilirdiniz belki dediğim gibi fonksiyon içinde çalışmayan bişeyler var, (fonksiyon içinde dizinin boyutunu alamadığımız gibi).

    şöyle yeni bir değişken tanımlayın
    boolean tweetsarti = false;

    millis içinde daha daha önce çağırdığınız TweetAt(); fonksiyonu yerine
    tweetsarti = true; // yazın

    TweetAt(); fonksiyonu içindeki kodları tweetsarti doğru ise çalıştırın

    if( tweetsarti){

    // tweet atan kodlar

    tweetsarti = false;// tekrar false
    }

  • tweetAt() fonksiyonunu koşul dışında aşağıdaki gibi denediğimde hiç bir sorun yok.Bu şekilde 1 dakikada bir tweet atıyor.
    void loop () {
    ether.packetLoop(ether.packetReceive());

    const char* reply = ether.tcpReply(session);
    if (reply != 0) {

    Serial.println(reply);
    }

    if (millis() > timer) {
    timer = millis() + 60000;
    Serial.print("Baglanti kuruluyor");
    TweetAt();
    }

    }
  • //////////millis içinde daha daha önce çağırdığınız TweetAt(); fonksiyonu yerine
    tweetsarti = true; // yazın"

    Bu dediğini aşağıdaki gibi yaptım hocam.Tabi önce tweetsarti değişkenini yukarda tanımladım.

    void loop() {
    if(t > 24){
    tweetsarti=true;
    }

    ////////////TweetAt(); fonksiyonu içindeki kodları tweetsarti doğru ise çalıştırın

    if( tweetsarti){ // birde burası sanırım tweetsarti==true olacak ?

    // tweet atan kodlar

    tweetsarti = false;// tekrar false
    }

    burayı karıştırdım ama.Bu bloğu komple loopun içine mi yazayım yoksa tweetat() fonksiyonunun içine mi yazayım anladım. ;/
  • boolean değişkenler ya doğru ya da değildir bu yüzden if( tweetsarti){ dogrudur,
    (ünlem karakteri sayesinde) if(!tweetsarti){ doğru değildir gibi kullanılabilir tweetsarti==true yapmanıza gerek yoktur size öyle kolay gelirse dediğiniz gibi de kullanabilirsiniz

    ////////////burayı karıştırdım ama.Bu bloğu komple loopun içine mi yazayım yoksa tweetat() fonksiyonunun içine mi yazayım anladım. ;/

    tweetat() fonksiyonu sileceksiniz sadece fonksion içindeki kodları dediğim yere yazacaksınız

    static void TweetAt () {
    // buradaki kodları
    }


    ayrica daha önce koşul içinde denediğinizde aşağıdaki kodları da kullandınız mı?
    ether.packetLoop(ether.packetReceive());
    const char* reply = ether.tcpReply(session);

    test ederken kullanıp koşula bağladığınızda silmiyorsunuz herhalde bir de bu kodları da millis içinde yazmayı deneyin

    mutlaka bir şeyleri atlıyor veya doğru yerde kullanmıyorsunuz yoksa koşula girince çalışmaması doğal değil
  • -tweetat() fonksiyonu sileceksiniz sadece fonksion içindeki kodları dediğim yere yazacaksınız

    Hocam iki posttur bu dediğiniz yeri bir türlü anlayamadım ;)

    void loop () {

    ether.packetLoop(ether.packetReceive());
    const char* reply = ether.tcpReply(session);
    if (reply != 0) {

    Serial.println(reply);
    }
    float t = dht.readTemperature();
    Serial.println(t,0);
    delay(1000);
    if(t > 24){
    tweetsarti=true;
    if( tweetsarti){
    //Tweet atan kodlar (tweetat fonksiyonu içindeki kodlar buraya kes yapıştır yapılmıştır.)
    tweetsarti=false;
    }
    }
    }

    Eğer yapı bu şekilde olacaksa malesef çalışmadı yine. ;/
  • /////////Tweet atan kodlar (tweetat fonksiyonu içindeki kodlar buraya kes yapıştır yapılmıştır.) bunu doğru anlamışsın fakat iç içe değil ayrı ayrı olacaktı

    if(t > 24){
    tweetsarti=true;
    }

    if( tweetsarti){
    tweetsarti=false;
    }
    gibi


    üstte çalışıyor dediğiniz kodlara sadece derece 24 olduğunda şartı ekle bakalım ne olacak iyice garipleşti bu sorun

    void loop () {

    float t = dht.readTemperature();
    Serial.println(t, 0);
    delay(1000);

    ether.packetLoop(ether.packetReceive());
    const char* reply = ether.tcpReply(session);

    if (reply != 0) {
    Serial.println(reply);
    }

    if (millis() > timer && t > 24) { // kod aynı sadece t büyükse 24 ten şartı da var
    timer = millis() + 60000;
    Serial.print("Baglanti kuruluyor");
    TweetAt(); //burayı birde daha sonra silip aşağıda dediğimi uygula
    }

    }

    bunu denedikten sonra birde TweetAt(); olan satırı silip tweetat fonksiyonu içindeki kodlar buraya kes yapıştır yap daha önce yaptığın gibi

    bir fikrim yok ama, olmadı bir deneme daha yaparak şu 2 satırı da
    ether.packetLoop(ether.packetReceive());
    const char* reply = ether.tcpReply(session);
    millis içinde dene
  • Hiç bir şekilde olmuyor hocam kafayı yemek üzereyim. Bu kadar zor olmamalı. Şart yokken sorunsuz çalışan meret şey basit bir şart içine alındığında neden çalışmaz anlamıyorum. ;/
  • bazen öyledir adamı çileden çıkarır hatta o anda balyozu alıp kırası gelir insanın
    dediğiniz gibi basit bir şart aslında çalışıyor dediğiniz kodlar da da if (millis() şartı var
    acaba diyorum sorun burda olabilir mi? float t = dht.readTemperature();

    bu değişken her seferinde loop içinde oluşuyor ve TweetAt(); fonksiyonundan önce bu değiişkeni başlangiçta oluştursanız.

    float t;

    ve sonra

    if (millis() > timer && t > 24) {
    timer = millis() + 60000;
    Serial.print("Baglanti kuruluyor");
    TweetAt();
    }
    t = dht.readTemperature();

    şeklinde güncelleseniz ne olur acaba ve sanırım bu en son imkanımız diğer her şeyi denedik balyoz dışında :)
  • bir konu daha var tüm bunları denerken arduino ve diğer kartlar nasıl besleniyor bilgisayarın USB portundan mı?
    DHT11 den veri okurken yaptığımız şartlar çalışmıyor olduğu için acaba diyorum USB portunun verdiği akımın yetersiz kaldığı için ethernet modülü yetersiz akım yüzünden çalışmayı bir an durdurup sonra devam ediyor olabilir mi.
    testleri hep pc nin USB portundan denediyseniz bir de en az 2a akım veren bir güç kaynağı deneyin
  • Bir önceki postta yazdıkların da olmadı hocam. Usb portunda sorun olsa orjinal kodlarda da sorun çıkar ve tweet atmazdı ;)
  • evet ben de Usb portunda sorun olsa orjinal kodlarda da sorun çıkar diye düşündüm ancak derece değiştiği zaman farklı amperler çekebilir diye dedim olabilir sen yine de dene bence
  • Hocam çok dallanıp budaklandık daha basit bir çözümü var bence gözümüzden kaçan. Böyle giderse bırakıcam projeyi soğudum artık denemediğim hiç bir şey kalmadı ;/
  • doğru diyorsunuz o kadar dallandık ki ama denemediğimiz yöntem de kalmadı gibi görünmekte tekrar tekrar baktım bir şey kaçırdık mı diye ufak bişeyler buldum gibi ama umutlu da değilim bunca yaşananlardan sonra ben de

    weetAt() fonksiyonunu koşul dışında çalışıyor ve fonksiyonun içinde
    float t = dht.readTemperature();
    float h = dht.readHumidity();

    var ve biz loop içinde tekrar float t kullandığımızda çalışmıyoır
    yani
    float t = dht.readTemperature();
    deyınce ve t değişkeni şarta aldığımızda sorun çıkıyor

    acaba diyorum float t değişkeni hem loop hem de fonksiyonda tekrar ettiğinden kaynaklı olabilirmi
    bunları kodların başında tanımlasan
    float t;
    float h;

    loop içinde
    t = dht.readTemperature();
    h = dht.readHumidity();

    yapsan ve weetAt() fonksiyonu içinde olanları da silsen sonra
    if (millis() > timer && t > 24) {

    birşeyler değiştirir mi?
  • Hocam merhaba, dediğim gibi projeden vazgeçtim ve c# üzerinden ethernet bağlantısı ile yaptım. Yalnız bir sorun var. Proje ethernet modülü üzerinden haberleşiyor. 2 saniye de bir sıcaklık ve nem ölçüyor bu bilgileri 5 dk da bir if şartı yerine geldiyse((if isi>25)) tweet atıyor.

    Bu şekilde 5 dk kadar çalışıyor ve ethernet modüle ping atılmıyor. Usb den besliyorum devreyi acaba voltaj mı az geliyor. Yahut sıcaklık okuma süresini 2 saniye yerine daha da artırayım mı ondan da olabilir mi acaba ?
  • voltaj değil de akım az gelebilir özellikle PC Usb den besliyorsan cep telefonu bile cihaz yavaş şarj oluyor uyarısı veriyor benim PC de, daha önce de usb yerine bir de harici 2A bir kaynakla besleyin dedim.
    durduğunda arduino da duruyormu sadece ethernet bağlantısı mı kesiliyor bunu da gözlemleyin akım yetmezliği yüzünden oscillator durursa arduino donabilir bende olmuştu gerçi 2 hafta çalışmadan sonra ama olabilir işte herşey mümkün
  • Arduinonun durduğunu şimdilik anlayamıyorum ama serial monitöre çıktı alarak anlayabilirim.Deneyip yazarım buraya hocam saolasın.
  • C# tarafında hem ısı okuyan timer'ı hem de tweetat timer'ın yenileme sürelerini 30 dk ya çıkardım gün boyu takip ettim kopma yaşanmadı. Herşey için teşekkürler hocam ;)

Howdy, Stranger!

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

Login with Facebook

Tagged

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