2016-02-23 5 views
-1

Я хочу отображать миллины на ЖК-дисплее 16x2, но проблема в том, что счетчик не начинается с нуля после добавления кода вставки MySQL. На самом деле, иногда подключение к серверу начинается через 4 сек, 40 секунд, а иногда и 79 секунд.Arduino Millis на ЖК-дисплее

Тип Arduino, который я использую: «Arduino Uno», и версия IDE Arduino - 1.6.7.

Может кто-нибудь помочь мне решить эту проблему, а вот код:

#include <Ethernet.h> 
#include <LiquidCrystal.h> 
#include <MySQL_Connection.h> 
#include <MySQL_Cursor.h> 

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 

IPAddress server_addr(); // IP of the MySQL *server* here 

char user[] = "";    // MySQL user login username 
char password[] = "";  // MySQL user login password 


EthernetClient client; 
MySQL_Connection conn((Client *)&client); 

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); 

void setup() { 

// set up the LCD's number of columns and rows: 
lcd.begin(16, 2); 

// Print a message to the LCD. 
lcd.print("Millis"); 

Serial.begin(115200); 
while (!Serial); // wait for serial port to connect 
Ethernet.begin(mac_addr); 
Serial.println("Connecting..."); 
if (conn.connect(server_addr, 3306, user, password)) { 
delay(1000); 
} 

else 
Serial.println("Connection failed."); 
} 


void loop() { 

unsigned long var =(millis()/1000); 

if(var%40 == 0) 
{ 

char INSERT_SQL[] = "UPDATE Information.total SET reading=(%d) WHERE 
Name='Sam';"; 
char query[255]; 
sprintf(query, INSERT_SQL, var); 
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); 
cur_mem->execute(query); 

delete cur_mem; 

} 

lcd.setCursor(0, 1); 
lcd.print(var); 

} 

И вот другой код, в котором Миллис начать с нуля (Перед установкой MySQL вставить код):

#include <LiquidCrystal.h> 

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); 

void setup() { 
lcd.begin(16, 2); 
Serial.begin(9600); 
lcd.print("Millis"); 

} 

void loop() { 
unsigned long var =(millis()/1000); 
var = (var==0)?1:var; 
if(var%40 == 0) 
{ 
Serial.println("Millis: "); 
Serial.println(var); 
    } 
lcd.setCursor(0, 1); 
lcd.print(millis()/1000); 
delay(1000); 
} 

Все ответы ценят ...

+0

Не могли бы вы отредактировать свое сообщение, включив код, начинающийся с нуля? –

+0

Вы пытаетесь обновить базу данных каждые 40 миллисекунд? –

+0

Не могли бы вы отобразить миллисы и начать с нуля каждый раз или, по крайней мере, с момента, прошедшего с момента начала показа? –

ответ

0

Миллис это количество миллисекунд, прошедших с начала, что программа на Arduino

Я был бы удивлен, если это когда-либо нулевой (если только не перевернулась)

+0

Спасибо за ваш повтор, на самом деле это было хорошо и звезды с нуля. –

+0

@ Некоторый, этот ответ не дает решения проблемы, рассматриваемой в вопросе. Пожалуйста, подумайте над тем, чтобы подробнее объяснить ваш ответ. В противном случае комментарий будет более уместным. –

+0

@ Некоторое, я пытаюсь отправить значение для каждых 40 миллисекунд в базу данных, пока миллины непрерывно отображаются на ЖК-дисплее. –

0

Millis() дает количество миллисекунд, прошедших с момента устройство было сила дальше. Он дает вам unsigned long. Итак, что произойдет, если достигнуто High этого unsigned long? ... Оно перевернулось и снова начинается с нуля (помните об этом).

Итак, у вас есть несколько вариантов отображения миллисекунд, который начинается с нуля;

  1. Если вы используете millis(), то вы должны иметь переменную, которая держит очень первым millis() вы просили. Затем на каждой петле снова получите millis() и вычтите первый millis() из последнего. Вы получаете фактическую сумму, которая прошла. Трюк состоит в том, чтобы помнить, что он может опрокинуться, к которому вы должны быть готовы.

  2. Используйте стороннюю библиотеку, такую ​​как elapsedMillis, которая фактически дает время, прошедшее через миллисекунды, так как вы инициализировали таймер до нуля. Легко найти через поиск.

Вот пример пункта 1:

#include <limits.h> 

unsigned long FirstMillis; 

void setup() { 
    // The value assigning you can put wherever you want when you want 
    // to start the initialization just remember that you can only 
    // declare the variable once otherwise it will be overwritten each time. 
    // Also do not assign on each loop without checking whether it is time 
    // to assign 
    FirstMillis = millis(); 
} 

void loop() { 
    unsigned long LatestMillis = millis(); 
    unsigned long TimeElapsed = 0; 

    // Check for overflow. I would assume that you will have restarted 
    // the timing again before the full range of FirstMillis + ULONG_MAX has been 
    // depleted. If so overflow will only happen once. ULONG_MAX 
    // in milliseconds is longer than 49 days. 
    if (LatestMillis < FirstMillis) 
    TimeElapsed = (ULONG_MAX - FirstMillis) + LatestMillis; 
    else 
    TimeElapsed = LatestMillis - FirstMillis; 

lcd.print(TimeElapsed); 
} 
0

Предполагая, что MySQL занимает некоторое время, чтобы установить соединение, необходимо вычислить время, прошедшее только после этого. Я добавил функцию elapsedTime в свой код, который вычисляет количество прошедших секунд после установления соединения. Если вы планируете держать свой совет на более 49 дней, вам необходимо принять во внимание совет @Blurry. Дополнительные сведения об этой проблеме see this link.

Обновленный код:

#include <Ethernet.h> 
#include <LiquidCrystal.h> 
#include <MySQL_Connection.h> 
#include <MySQL_Cursor.h> 

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 

IPAddress server_addr(); // IP of the MySQL *server* here 

char user[] = "";   // MySQL user login username 
char password[] = "";  // MySQL user login password 

EthernetClient client; 
MySQL_Connection conn((Client *)&client); 

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); 

unsigned long initialTime; 

void setup() { 

    // set up the LCD's number of columns and rows: 
    lcd.begin(16, 2); 

    // Print a message to the LCD. 
    lcd.print("Millis"); 

    Serial.begin(115200); 
    while (!Serial); // wait for serial port to connect 
    Ethernet.begin(mac_addr); 
    Serial.println("Connecting..."); 
    if (conn.connect(server_addr, 3306, user, password)) { 
     delay(1000); 
    } else { 
     Serial.println("Connection failed."); 
    } 

    // Initial value of millis() after connection. 
    initialTime = millis()/1000; 
} 

unsigned long elapsedSeconds() { 
    return (millis()-initialTime)/1000; 
} 

void loop() { 
    unsigned long var = elapsedSeconds(); 
    lcd.setCursor(0, 1); 
    lcd.print(var); 

    if(var%40 == 0) { 
     char INSERT_SQL[] = 
      "UPDATE Information.total SET reading=(%d) WHERE Name='Sam';"; 
     char query[255]; 
     sprintf(query, INSERT_SQL, var); 
     MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); 
     cur_mem->execute(query); 
     delete cur_mem; 
    } 
} 

Ожидаемый результат на ЖК-дисплее:

, предполагающая запрос в функции петлевой занимает менее одной секунды, вы должны увидеть следующий вывод: 0 1 2 3 4 5 6 7....Однако, если запрос занял несколько секунд, например, 10 секунд, вы должны увидеть выход вроде 0 10 20 30... или немного отличаться. В этом случае я бы сказал, что невозможно использовать то, что вы хотите, используя этот конкретный подход.

+0

@Artlon, спасибо за ваши усилия, но все же я получаю одинаковые результаты! Возможно, некоторые проблемы связаны с номером порта или ответом DHCP. –

+0

@ Нураллах, какой результат вы получили на ЖК-дисплее? –

+0

@Artlon, тот же результат для исходного кода. –

 Смежные вопросы

  • Нет связанных вопросов^_^