uno+shild 5100. Непонятный глюк.

Тема в разделе "Arduino & Shields", создана пользователем Конст, 13 окт 2016.

  1. Конст

    Конст Нуб

    Здравствуйте!
    Имею: uno(клон), ethernet shield5100 (клон) и датчик влажности/температуры. Собираю информацию о влажности и температуре в mysql.
    Код:
    Код (C++):

    #define DHTPIN 2
    #define DHTTYPE DHT11
    #include <DHT.h>
    #include <SPI.h>
    #include <MySQL_Connection.h>
    #include <MySQL_Cursor.h>
    #include <Ethernet.h>
    byte mac[] = {
      0x00, 0xFF, 0xBB, 0xFF, 0xDE, 0xDD
    };
    EthernetClient client;
    IPAddress server_addr(127, 0, 0, 1);
    unsigned int mysqlPort = 3306;
    MySQL_Connection conn((Client *)&client);
    char user[] = "USER";
    char password[] = "PASSWORD";
    boolean sqlconnect = false;

    DHT dht(DHTPIN, DHTTYPE);
    void setup() {

      Serial.begin(9600);
      if (Ethernet.begin(mac) == 0) {
        Serial.println("Failed to configure Ethernet using DHCP");
        for (;;)
          ;
      }
      if (conn.connect(server_addr, 3306, user, password)) {
        Serial.println("fqw");
      }
      dht.begin();


    }

    void loop() {
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      float f = dht.readTemperature(true);
      String one;
      String four;
      String str;
      char query[160];
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }
      one = "set @b = (select count(*) from tempcontrol.q)+1;set @s = (select now());insert into tempcontrol.q(id,temp, h,t) values(@b,";
      four = "@s)";
      str = one + t + "," + h + "," + four;

      MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
      const char *str2 = str.c_str();
      sprintf(query, str2);
      cur_mem->execute(query);
      delete cur_mem;
      delay(300000);
    }
    Сервер СУБД удалённый. Проблема следующего характера: через некоторое время данные перестают отдаваться в базу. Время - около 7 часов. Где-то вычитал, что может быть проблема с нехваткой памяти, но вроде бы всё реализовано достаточно просто. Подскажите, куда копать. Заранее спасибо.
     
    Последнее редактирование: 13 окт 2016
  2. rkit

    rkit Гуру

    Все реализовано довольно паршиво.
    Это проверяет совсем не то. https://ru.wikipedia.org/wiki/NaN


    Это все делается в sprintf. http://www.c-cpp.ru/content/printf

    Все константные строки обернуть в F() https://www.arduino.cc/en/Reference/PROGMEM
    one = F("set @b = (select count(*) from tempcontrol.q)+1;set @s = (select now());insert into tempcontrol.q(id,temp, h,t) values(@b,");


    В mysql указать поле id как auto_inrement, запрос упростить до
    "insert into tempcontrol.q(temp, h,t) values(%f, %f, now())"

    Отформатировать код как положено, выкинуть лишние переменные. Дальше уже можно будет разбираться с проблемой, если она останется.