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 :smiley: 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