Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Stacja pogodowa arduino z wysyłaniem danych na serwer

korzeniewski36 22 Lis 2017 05:30 1191 11
  • #1 22 Lis 2017 05:30
    korzeniewski36
    Poziom 5  

    Witam, w internecie znalazlem ciekawy poradnik dotyczący budowy stacji pogodowej, cena w miare przystepna, ale co zrobic aby ten zestaw przesyłał dane np na serwer thingspeak? Co dokupić , co zmodyfikować jeżeli chodzi o czujniki? Interesuja mnie czujnik temperatury, temperatury przygruntowej, wilgotności, ciśnienia, naslonecznienia, czujnik zanieczyszczenia powietrza, i ewentualnie czujnik opadów. Dodam że jestem ciemny w programowaniu i nigdy tego nie robiłem, dla tego liczę na waszą pomoc.

    Link do poradnika https://abc-rc.pl/_blog/59-Stacja_meteorologiczna_cz_4.html#axzz4VSPOGI2i

    0 11
  • #2 22 Lis 2017 10:25
    m.biruta
    Poziom 16  

    Jeśli opierasz się o arduino to musisz mieć wyjście na świat. Jeśli chcesz łączyć się z internetem bezprzewodowo to musisz dokupić np. ESP8266, jeśli przewodowo to ethernet shield.

    0
  • #3 25 Lis 2017 19:27
    korzeniewski36
    Poziom 5  

    Witam, zabrałem się sam za budowę stacji pogodowej z wysyłaniem na serwer,
    Jako że jestem początkujący to chyba coś zepsułem w kodzie, chciałem dodać narazie drugi czujnik dth22 lecz w serial monitorze pokazuje mi tylko temperaturę i wilgotność z dth11,

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 26 Lis 2017 11:50
    JacekCz
    Poziom 36  

    Piottr242 napisał:
    Dwa razy definiujesz to samo. Raz DHTPIN to jest 10, drugi raz to jest 9. Dwa razy tworzysz obiekt o tej samej nazwie.
    Dla drugiego czujnika użyj innych identyfikatorów.


    Mam mocne wrażenie, że to się nawet nie kompiluje *), oprócz w/w takie detale jak średniki itd...
    nie każdy od razu jest geniuszem, ale jak kolega chce pomocy, niech chociaż dobre relacjonuje problemy, np kopiuje dokładnie błędy

    *) w związku z tym pytanie, co się naprawdę wykonuje? Ostatni kompilujący się bez błędów kod?

    0
  • #6 30 Lis 2017 10:18
    korzeniewski36
    Poziom 5  

    Witam Czujniki już okiełznałem ale jest kolejny problem.... Próbuje te dane wysłac na serwer thingspeak lecz arduino wysyła tylko raz po ponownym podłączeniu zasilania i czasami kiedy mu sie podoba....
    Aktualnie korzystam z jednego czujnika dth11 i robie wszystko tak jak w tym poradniku https://www.youtube.com/watch?v=4XEe0HY0j6k&t=277s Wszystko identycznie podłączone, taki sam moduł wifi


    Serial monitor wyświetla:
    AT+CWMODE<1


    OK
    AT+CWJAP="korzen0871","kogutx20111"

    WIFI DISC⸮ʪ⸮(UH⸮WIFI CONOECTED
    WIFI GOT IP

    OK
    Setup completed
    Temp=22.00 *C
    Humidity=66.00 %
    AT+CIPSTART="TCP","184.106.153.149",80
    AT+CIPSEND=66
    AT+CIPCLOSE
    Temp=22.00 *C
    Humidity=56.00 %
    AT+CIPSTART="TCP","184.106.153.149",80
    AT+CIPSEND=66
    GET /update?api_key=GA8L39YZCBB9JXE6&field1=22.00&field2=56.00


    Zaś mój kod wygląda tak


    Code:


    #include <SoftwareSerial.h>
    SoftwareSerial espSerial =  SoftwareSerial(2,3);      // arduino RX pin=2  arduino TX pin=3    connect the arduino RX pin to esp8266 module TX pin   -  connect the arduino TX pin to esp8266 module RX pin



    #include <DHT.h>        //Attention: For new  DHT11 version  library you will need the Adafruit_Sensor library
                            //Download from here: https://github.com/adafruit/Adafruit_Sensor



    //Attention: For new  DHT11 version  libraries you will need the Adafruit_Sensor library
    //Download from here:https://github.com/adafruit/Adafruit_Sensor
    //and install to Arduino software

    #define DHTPIN 5                // Connect the signal pin of DHT11 sensor to digital pin 5
    #define DHTTYPE DHT11
    DHT dht(DHTPIN, DHTTYPE);


    String apiKey = "GA8L39YZCBB9JXE6";     // replace with your channel's thingspeak WRITE API key

    String ssid="korzen0871";    // Wifi network SSID
    String password ="koguty20111";  // Wifi network password

    boolean DEBUG=true;

    //======================================================================== showResponce
    void showResponse(int waitTime){
        long t=millis();
        char c;
        while (t+waitTime>millis()){
          if (espSerial.available()){
            c=espSerial.read();




            if (DEBUG) Serial.print(c);
          }
        }
                       
    }

    //========================================================================
    boolean thingSpeakWrite(float value1, float value2){
      String cmd = "AT+CIPSTART=\"TCP\",\"";                  // TCP connection
      cmd += "184.106.153.149";                               // api.thingspeak.com
      cmd += "\",80";
      espSerial.println(cmd);
      if (DEBUG) Serial.println(cmd);
      if(espSerial.find("Error")){
        if (DEBUG) Serial.println("AT+CIPSTART error");
        return false;
      }
     
     
      String getStr = "GET /update?api_key=";   // prepare GET string
      getStr += apiKey;
     
      getStr +="&field1=";
      getStr += String(value1);
      getStr +="&field2=";
      getStr += String(value2);
      // getStr +="&field3=";
      // getStr += String(value3);
      // ...
      getStr += "\r\n\r\n";

      // send data length
      cmd = "AT+CIPSEND=";
      cmd += String(getStr.length());
      espSerial.println(cmd);
      if (DEBUG)  Serial.println(cmd);
     
      delay(100);
      if(espSerial.find(">")){
        espSerial.print(getStr);
        if (DEBUG)  Serial.print(getStr);
      }
      else{
        espSerial.println("AT+CIPCLOSE");
        // alert user
        if (DEBUG)   Serial.println("AT+CIPCLOSE");
        return false;
      }
      return true;
    }
    //================================================================================ setup
    void setup() {               
      DEBUG=true;           // enable debug serial
      Serial.begin(9600);
     
      dht.begin();          // Start DHT sensor
     
      espSerial.begin(115200);  // enable software serial
                              // Your esp8266 module's speed is probably at 115200.
                              // For this reason the first time set the speed to 115200 or to your esp8266 configured speed
                              // and upload. Then change to 9600 and upload again
    ////   
    //     espSerial.println("AT+RST");         // Enable this line to reset the module;
    //     showResponse(1000);

    //    espSerial.println("AT+CIOBAUD=9600");    // Enable this line to set esp8266 serial speed to 9600 bps
    //    showResponse(1000); 
     

      espSerial.println("AT+CWMODE=1");   // set esp8266 as client
      showResponse(1000);

      espSerial.println("AT+CWJAP=\""+ssid+"\",\""+password+"\"");  // set your home router SSID and password
      showResponse(5000);

       if (DEBUG)  Serial.println("Setup completed");
    }


    // ====================================================================== loop
    void loop() {

      // Read sensor values
       float t = dht.readTemperature();
       float h = dht.readHumidity();
            if (isnan(t) || isnan(h)) {
            if (DEBUG) Serial.println("Failed to read from DHT");
          }
          else {
              if (DEBUG)  Serial.println("Temp="+String(t)+" *C");
              if (DEBUG) Serial.println("Humidity="+String(h)+" %");
               thingSpeakWrite(t,h);                                      // Write values to thingspeak
          }
     
       
      // thingspeak needs 15 sec delay between updates,     
      delay(20000); 
    }





    Po zmianie szybkości na 9600 modułu wifi W ogóle arduino go nie inicjuje

    Błagam o pomoc

    0
  • #7 30 Lis 2017 10:35
    JacekCz
    Poziom 36  

    korzeniewski36 napisał:
    Prubuje te dane wysłac na serwer thingspeak lecz arduino wysyła tylko raz po ponownym podłączeniu zasilania i czasami kiedy mu sie podoba.
    ......
    GET /update?api_key=GA8L39YZCBB9JXE6&field1=22.00&field2=56.00



    GET w tej dziedzinie nie powinienem służyć do aktualizacji. Może być cachowany / skutecznie na serwerze więcej razy niż sie oczekuje / albo mniej.
    Wg wszelkich zasad powinien to być POST (czasem PUT)

    Oraz ma się sprawdzać kod HTTP, jako pozytywny można rozumieć 200 ale kilka innych -> dokumentacja thingspeak

    0
  • #9 30 Lis 2017 10:43
    JacekCz
    Poziom 36  

    korzeniewski36 napisał:
    Czyli zmienic na POST??


    Niczego nie robiłem na thigspeak. Jestem zdziwiony przykładami GET do aktualizacji. Nie robią tego zgodnie z ogólnym wzorcem.
    Taki GET leci przez providerów, wielu cachuje itd...

    0
  • #10 30 Lis 2017 14:37
    korzeniewski36
    Poziom 5  

    Ani tak, ani tak nie działa..... Nie wiem czemu ale mam przeczucie że coś jest z modułem wifi.....

    Dodano po 3 [godziny] 53 [minuty]:

    Oki, Temat Ogarnięty trzeba było zmusić ESP8266 żeby działał na 9600 a nie na 115200.
    Jakiej funkcji użyć żeby na wyświetlaczu lcd 2x16 były na przemian pokazywane wartości ze wskazań Czujników??
    EKRAN 1 To np temp i wilgot.
    EKRAN 2 to np Wiatr i opady
    Chciał bym żeby się to zmieniało np co 3 sekundy??

    0
  • #11 30 Lis 2017 17:16
    Freddy
    Poziom 43  

    korzeniewski36 napisał:
    Link do poradnika ... Stacja meteorologiczna
    Bardzo mi się podoba ta strona, a zwłaszcza niektóre stwierdzenia na niej. :)
    Cytat:
    ... Słowo termistor oznacza zmianę rezystancji wewnętrznej w zależności od temperatury
    Cytat:
    ... Wszystkie wymienione powyżej czujniki funkcjonują w oparciu o podobną zasadę. Większość z nich ma sądy najczęściej występujące w takiej formie:
    Takich kwiatków jest więcej :D.

    Wszystkie czujniki oczywiście dostępne w sklepie który prowadzi blog.
    Szkoda tylko, że w czterech częściach opisujących budowę stacji nie znalazły się przykładowe fragmenty kodu dla zachwalanego Arduino.

    0
  • #12 01 Gru 2017 19:58
    korzeniewski36
    Poziom 5  

    I znów następny czujnik, i następny problem..... Proszę zerknijcie na ten kod i powiedzcie czemu czujnik ds18b20 Nie odświeża temperatury??
    ani na serialmonitor ani też na wyświetlaczu, Czujnik działa poprawnie w gotowych przykładach.

    Code:


    #include <DHT.h>
    #include <SoftwareSerial.h>

    SoftwareSerial espSerial =  SoftwareSerial(8, 7);     
    #include <LiquidCrystal.h>
    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
    #include <OneWire.h>
    #include <DallasTemperature.h>





    //Attention: For new  DHT11 version  libraries you will need the Adafruit_Sensor library
    //Download from here:https://github.com/adafruit/Adafruit_Sensor
    //and install to Arduino software

    #define DHT1PIN 10
    #define DHT2PIN 9
    #define DHT1TYPE DHT11
    #define DHT2TYPE DHT22
    #define ONE_WIRE_BUS 6
    DHT dht1(DHT1PIN, DHT1TYPE);
    DHT dht2(DHT2PIN, DHT2TYPE);
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature s(&oneWire);

    int opady = 0;
    String apiKey = "GA8L39YZCBB9JXE6";     // replace with your channel's thingspeak WRITE API key

    String ssid = "korzen0871";  // Wifi network SSID
    String password = "koguty20111"; // Wifi network password

    boolean DEBUG = true;

    //======================================================================== showResponce
    void showResponse(int waitTime) {
      long t = millis();
      char c;
      while (t + waitTime > millis()) {
        if (espSerial.available()) {
          c = espSerial.read();
          if (DEBUG) Serial.print(c);
        }
      }

    }

    //========================================================================
    boolean thingSpeakWrite(float value1, float value2, float value3, float value4, float value5, float value6) {
      String cmd = "AT+CIPSTART=\"TCP\",\"";                  // TCP connection
      cmd += "184.106.153.149";                               // api.thingspeak.com
      cmd += "\",80";
      espSerial.println(cmd);
      if (DEBUG) Serial.println(cmd);
      if (espSerial.find("Error")) {
        if (DEBUG) Serial.println("AT+CIPSTART error");
        return false;
      }


      String getStr = "GET /update?api_key=";   // prepare GET string
      getStr += apiKey;


      getStr += "&field1=";
      getStr += String(value1);
      getStr += "&field2=";
      getStr += String(value2);
      getStr += "&field3=";
      getStr += String(value3);
      getStr += "&field4=";
      getStr += String(value4);
      getStr += "&field5=";
      getStr += String(value5);
      getStr += "&field6=";
      getStr += String(value6);
      getStr += "\r\n\r\n";

      // send data length
      cmd = "AT+CIPSEND=";
      cmd += String(getStr.length());
      espSerial.println(cmd);
      if (DEBUG)  Serial.println(cmd);

      delay(100);
      if (espSerial.find(">")) {
        espSerial.print(getStr);
        if (DEBUG)  Serial.print(getStr);
      }
      else {
        espSerial.println("AT+CIPCLOSE");
        // alert user
        if (DEBUG)   Serial.println("AT+CIPCLOSE");
        return false;
      }
      return true;
    }
    //================================================================================ setup
    void setup() {
      DEBUG = true;         // enable debug serial
      Serial.begin(9600);

      dht1.begin();
      dht2.begin();
      lcd.begin(16, 2);
      espSerial.begin(9600);
      s.begin();
      //espSerial.println("AT+RST");         // Enable this line to reset the module;
      //showResponse(1000);

      //espSerial.println("AT+UART_CUR=9600,8,1,0,0");    // Enable this line to set esp8266 serial speed to 9600 bps
      //showResponse(1000);



      espSerial.println("AT+CWMODE=1");   // set esp8266 as client
      showResponse(1000);

      espSerial.println("AT+CWJAP=\"" + ssid + "\",\"" + password + "\""); // set your home router SSID and password
      showResponse(5000);

      if (DEBUG)  Serial.println("Setup completed");
    }


    // ====================================================================== loop
    void loop() {

      // Read sensor values
      float t1 = dht1.readTemperature();
      float h1 = dht1.readHumidity();
      float t2 = dht2.readTemperature();
      float h2 = dht2.readHumidity();
      float o = opady;
      float so = s.getTempCByIndex(0);
      opady = analogRead(A0); //opady
      opady = map(opady, 1023, 0, 0, 100);

      if (isnan(t1) || isnan(h1)) {
        if (DEBUG) Serial.println("Failed to read from DHT11");
      }
      else {
        if (DEBUG)  Serial.println("Temp=" + String(t1) + " *C");
        if (DEBUG) Serial.println("Humidity=" + String(h1) + " %");
      }


      if (isnan(t2) || isnan(h2)) {
        if (DEBUG) Serial.println("Failed to read from DHT22");
      }
      else {
        if (DEBUG)  Serial.println("Temp=" + String(t2) + " *C");
        if (DEBUG) Serial.println("Humidity=" + String(h2) + " %");


      }
      if (isnan(so)) {
        if (DEBUG) Serial.println("Failed to read from czujnik");
      }
      else {
        if (DEBUG)  Serial.println("sensor=" + String(so) + " *C");
        thingSpeakWrite(t1, h1, t2, h2, o, so);                                   // Write values to thingspeak
      }



      lcd.setCursor(0, 0);
      lcd.print("Wilgot.=" + String(h2) + " %");
      lcd.setCursor(2, 1);
      lcd.print("Temp=" + String(so) + " *C");
      // peak needs 15 sec delay between updates,

      delay(2000);

    }




    0