Networking LCD上的Arduino Millis
我想在LCD 16x2上显示毫秒,但问题是在添加MySQL插入代码后,计数器不是从零开始的。实际上,有时到服务器的连接会在4秒、40秒、甚至79秒后启动 我使用的Arduino类型是:“Arduino Uno”, ArduinoIDE版本是1.6.7 谁能帮我解决这个问题,下面是代码: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
#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
,它实际上给出了自将计时器初始化为零以来经过的时间(以毫秒为单位)。通过搜索很容易找到#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; } }