Networking LCD上的Arduino Millis

Networking LCD上的Arduino Millis,networking,port,router,arduino-uno,dhcp,Networking,Port,Router,Arduino Uno,Dhcp,我想在LCD 16x2上显示毫秒,但问题是在添加MySQL插入代码后,计数器不是从零开始的。实际上,有时到服务器的连接会在4秒、40秒、甚至79秒后启动 我使用的Arduino类型是:“Arduino Uno”, ArduinoIDE版本是1.6.7 谁能帮我解决这个问题,下面是代码: #include <Ethernet.h> #include <LiquidCrystal.h> #include <MySQL_Connection.h> #include

我想在LCD 16x2上显示毫秒,但问题是在添加MySQL插入代码后,计数器不是从零开始的。实际上,有时到服务器的连接会在4秒、40秒、甚至79秒后启动

我使用的Arduino类型是:“Arduino Uno”, ArduinoIDE版本是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);

}
#包括
#包括
#包括
#包括
字节mac_addr[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};
IP地址服务器_addr();//这里是MySQL*服务器*的IP地址
字符用户[]=“”;//MySQL用户登录用户名
字符密码[]=“”;//MySQL用户登录密码
以太网络客户端;
MySQL_连接连接(客户端*)&客户端;
液晶显示器(2,3,4,5,6,7);
无效设置(){
//设置LCD的列数和行数:
lcd.begin(16,2);
//将消息打印到LCD。
lcd.打印(“毫秒”);
序列号开始(115200);
while(!Serial);//等待串行端口连接
以太网开始(mac_addr);
Serial.println(“连接…”);
if(连接(服务器地址,3306,用户,密码)){
延迟(1000);
}
其他的
Serial.println(“连接失败”);
}
void循环(){
无符号长变量=(毫秒()/1000);
如果(变量%40==0)
{
char INSERT_SQL[]”更新信息。集合读取总量=(%d)其中
Name='Sam';“;
字符查询[255];
sprintf(查询、插入、SQL、var);
MySQL\u Cursor*cur\u mem=新的MySQL\u Cursor(&conn);
cur_mem->execute(查询);
删除cur_mem;
}  
lcd.setCursor(0,1);
lcd.print(var);
}
ِ这里是另一个代码,其中millis从零开始(在插入MySQL插入代码之前):

#包括
液晶显示器(2,3,4,5,6,7);
无效设置(){
lcd.begin(16,2);
Serial.begin(9600);
lcd.打印(“毫秒”);
}
void循环(){
无符号长变量=(毫秒()/1000);
var=(var==0)?1:var;
如果(变量%40==0)
{
Serial.println(“Millis:”);
序列号println(var);
}  
lcd.setCursor(0,1);
lcd.打印(毫秒()/1000);
延迟(1000);
}

非常感谢您的回答。

Millis是该程序在arduino上启动后的毫秒数

如果它曾经是零(除非是滚动的),我会感到惊讶。

Millis()
提供设备通电后经过的毫秒数。它给您一个
无符号长字符
。那么,如果达到该
无符号长
,会发生什么?。。。它翻滚并再次从零开始(记住这一点)

因此,您有几个选项可以显示从零开始的毫秒

  • 如果使用的是
    millis()
    ,那么必须有一个变量来保存您请求的第一个
    millis()
    。然后在每个循环上再次获得
    millis()
    ,并从最新的
    millis()
    中扣除第一个
    millis()。你最终得到的是已经通过的实际金额。诀窍是要记住,它可以翻滚,你必须做好准备

  • 使用第三方库,如
    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);
    }
    
    #包括
    无符号长首毫秒;
    无效设置(){
    //指定的值可以在需要时放置在任何位置
    //要开始初始化,请记住您只能
    //声明变量一次,否则每次都会被覆盖。
    //也不要在没有检查是否是时间的情况下分配每个循环
    //分派
    FirstMillis=millis();
    }
    void循环(){
    无符号长最晚值=毫秒();
    无符号长时间经过=0;
    //检查溢出。我假设您将重新启动
    //在完成FirstMillis+ULONG_MAX的全量程之前再次计时
    //耗尽。如果是这样,溢出只会发生一次。ULONG_MAX
    //以毫秒为单位大于49天。
    if(最晚数<最早数)
    时间流逝=(ULONG_MAX-FirstMillis)+最晚millish;
    其他的
    时间经过=最晚的毫秒-第一毫秒;
    lcd.打印(经过的时间);
    }
    
    假设MySQL需要一些时间来建立连接,那么您只需要在建立连接之后计算运行时间。我在代码中添加了一个函数
    elapsedTime
    ,用于计算建立连接后经过的秒数。如果你计划将你的董事会保留超过49天,你需要考虑“模糊”的建议。有关该问题的更多详细信息

    更新代码:

    #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;
       }  
    }
    
    #包括
    #包括
    #包括
    #包括
    字节mac_addr[]={0xDE,0xAD,0xBE,0xEF,0xFE,0xED};
    IP地址服务器_addr();//这里是MySQL*服务器*的IP地址
    字符用户[]=“”;//MySQL用户登录用户名
    字符密码[]=“”;//MySQL用户登录密码
    以太网络客户端;
    MySQL_连接连接(客户端*)&客户端;
    液晶显示器(2,3,4,5,6,7);
    长时间未签名;
    无效设置(){
    //设置LCD的列数和行数:
    lcd.begin(16,2);
    //将消息打印到LCD。
    lcd.打印(“毫秒”);
    序列号开始(115200);
    while(!Serial);//等待串行端口连接
    以太网开始(mac_addr);
    Serial.println(“连接…”);
    if(连接(服务器地址,3306,用户,密码)){
    延迟(1000);
    }否则{
    Serial.println(“连接失败”);
    }  
    //连接后毫秒()的初始值。
    初始时间=毫秒()/1000;
    }
    无符号长延时秒数(){
    返回值(毫秒()-初始时间)/1000;
    }
    void循环(){
    无符号长var=elapsedSeconds();
    lcd.setCursor(0,1);
    lcd.print(var);
    如果(变量%40==0){
    char INSERT_SQL[]=
    “UPDATE Information.total SET reading=(%d),其中Name='Sam';”;
    字符查询[255];
    sprintf(查询、插入、SQL、var);
    MySQL\u Cursor*cur\u mem=新的MySQL\u Cursor(&conn);
    cur_mem->execute(查询);
    删除cur_mem;
    }  
    }
    #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;
       }  
    }