2017-03-27 69 views
0

,我有以下功能塊在我的基礎ESP8266 NodeMCU代碼:字符串格式的價值由字符替換的snprintf

snprintf (temp, 800, 
      "<html>\ 
    <head>\ 
    <meta http-equiv='refresh' content='25'/>\ 
    <title>NodeMCU DHT11 Sensor \and Relay Board</title>\ 
    <style>\ 
     body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\ 
     li { margin: 10px 0;}\ 
    </style>\ 
    </head>\ 
    <body>\ 
    <h1>Hello from NodeMCU!</h1>\ 
    <p>Temperature: %02d &#8451;<br>\ 
    Humidity: %2d %<br></p><ol>\ 
    <li><a href='/control?relay=5&state=%d'>Turn Relay 1 On\/Off</a>\ 
    <li><a href='/control?relay=4&state=%d'>Turn Relay 2 On\/Off</a></ol>\ 
    <p> Uptime: %02d:%02d:%02d </p>\ 
    </body>\ 
</html>", 
      t, h, !digitalRead(5), !digitalRead(4), hr, min % 60, sec % 60 
      ); 

我希望能與關替換文本,反之亦然基礎上,來自digitalRead(5)的引腳狀態。因此,我不必寫Turn Turn 1 On/Off,而應該使用digitalRead(pinNum)來獲得狀態,並根據狀態設置或禁用文本。

+0

要簡單的更換可能是隻使用三元運算到正確的字符串傳遞到snprintf作爲參數:'digitalRead(5)? 「on」:「off」' – CBroe

+0

我將使用什麼格式? '%C'! –

回答

0

ternary (conditional) operator是你的朋友在這裏。你可以把它當作一個內聯的if語句。語法如下所示

condition ? val1 : val2 

該表達式將根據condition產生結果。如果condition爲真,它將產生val1,否則它將產生val2

您可以在sprintf的參數列表中使用此參數根據引腳狀態返回一個字符串。

snprintf(temp, 800, 
    "... <li><a href='/control?relay=5&state=%d'>Turn Relay 1 %s</a><li> ... ", 
    !digitalRead(5), (digitalRead(5) ? "Off" : "On"); 

%s是一個字符串的佔位符,並取決於銷5的狀態時,它會通過"On""Off"

+0

看起來像'%s'不能在NodeMCU中工作:( –

+0

很難想象一個庫提供'snprintf',但它的格式字符串不支持'%s' ...也許你的程序中有其他錯誤 –