91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

電子發(fā)燒友App

硬聲App

掃碼添加小助手

加入工程師交流群

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>連接100英尺以外的OLED屏幕和I2C傳感器

連接100英尺以外的OLED屏幕和I2C傳感器

2022-11-03 | zip | 0.50 MB | 次下載 | 免費

資料介紹

描述

需要在距離您的項目太遠的傳感器位置添加 OLED 屏幕以獲取有意義的報告?

I2C 總線上連接的傳感器太多?那么你需要IO 擴展器!使用1-Wire? 到 I2C適配器,可以根據(jù)需要在 1-Wire? 總線上添加任意數(shù)量的 I2C 總線。

需要多條 1-Wire? 總線?IO Expander最多可同時支持 16 個。

需要更多?然后將最多 255 個IO 擴展器連接在一起;IO 擴展器真正提供極致的連接性!

功能列表

  • 使用便宜的 128x64 OLED 屏幕。
  • 在單個 1-Wire? 總線上使用多個 OLED 屏幕。
  • 使用不同的 OLED 屏幕尺寸。
  • 根據(jù)需要添加盡可能多的 I2C 總線。
  • 永遠不要用完 I2C 地址。只需添加另一個 I2C 總線。
  • 易于使用的圖形命令。
  • 1-Wire? 標準和過載,可實現(xiàn)快速屏幕更新。
  • 無需 1-Wire? 驅(qū)動器節(jié)省代碼空間。
  • 無需 OLED 驅(qū)動程序。節(jié)省代碼空間。
  • 不需要 OLED 字體。節(jié)省代碼空間。
  • 無需 DS18B20 溫度驅(qū)動器。節(jié)省代碼空間。
  • 無需 I2C 傳感器驅(qū)動程序。節(jié)省代碼空間。
  • 不需要額外的電源
  • 易于連接 RJ11 電話線。
  • 易于在 1-Wire? 總線上添加傳感器。
  • 熱插拔 1-Wire? 總線。

用于構(gòu)建 OLED 演示的部件

接線圖

pYYBAGNh7HCAN2tkAAOFZpehZrM013.jpg
?

俯視圖

?
?

運行此演示的 Arduino 代碼。

/* IO Expander OLED sketch
 *  
 *  Make sure you increase the SERIAL_RX_BUFFER_SIZE in Arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h
 *  from 64 to 256.
 */
 
#define SERIAL_RX_BUFFER_SIZE   256

#include 
#include 
#include "IOExpander.h"

#define FAHRENHEIT

#define OLED_SCREENS            5
#define TEMP_SENSORS            4
#define HUMIDITY_SENSORS        2

#define ONEWIRE_TO_I2C_ROM1     "i4s51"
#define ONEWIRE_TO_I2C_ROM2     "i4s2e"
#define ONEWIRE_TO_I2C_ROM3     "i4s24"
#define ONEWIRE_TO_I2C_ROM4     "i4sc0"
#define ONEWIRE_TO_I2C_ROM5     "i2see"

#define ONEWIRE_TEMP_CONVERSION "t4s0;tt"
#define TEMP_SENSOR1            "t4r4c"
#define TEMP_SENSOR2            "t4r57"
#define TEMP_SENSOR3            "t4r76"
#define TEMP_SENSOR4            "t4r0300"
#define HUMIDITY_SENSOR1        "st8"
#define HUMIDITY_SENSOR2        "s6t5"

#define INIT_OLED_SSD1306_32    "st10;si128,32"
#define INIT_OLED_SSD1306_64    "st10;si128,64"
#define INIT_OLED_SSD1106       "st13;si128,64"
#define INIT_OLED_SSD1309       "g1o0,10;s2t10;si128,64"

#define SERIAL_DEBUG

#ifdef SERIAL_DEBUG
SoftwareSerial swSerial(8,7);
#endif

struct TS {
  bool update;
  float temp;
  bool error;  
};

struct HS {
  bool update;
  float temp;
  float humidity;
  bool error;
};

int led = 13;

#ifdef FAHRENHEIT
#define C2F(temp)   CelsiusToFahrenheit(temp)
float CelsiusToFahrenheit(float celsius)
{
  return ((celsius*9)/5)32;
}
#else
#define C2F(temp)   (temp)
#endif

bool init_oled[OLED_SCREENS] = {true, true, true, true, true};
TS ts[TEMP_SENSORS];
HS hs[HUMIDITY_SENSORS];

void ReadTempSensor(TS* ts, char* ts_read)
{
  float temp = ts->temp;
 
  SerialCmd(ts_read);
  ts->error = !SerialReadFloat(&ts->temp);
  SerialReadUntilDone();
  ts->temp = roundf(ts->temp * 10) / 10;
  ts->update = (temp != ts->temp);
}

void ReadHumiditySensor(HS* hs)
{
  float temp = hs->temp;
  float humidity = hs->humidity;
 
  SerialCmd("sr");
  hs->error = !(SerialReadFloat(&hs->temp) && SerialReadFloat(&hs->humidity));
  SerialReadUntilDone();
  hs->temp = roundf(hs->temp * 10) / 10;
  hs->humidity = roundf(hs->humidity * 10) / 10;
  hs->update = (temp != hs->temp || humidity != hs->humidity);
}

void SerialPrintDecimal(const char* str, float decimal, char error)
{
  Serial.print(str);
  if (error) Serial.print(F("NA"));
  else Serial.print(decimal, 1);
  Serial.print(""");
}

void SerialPrintUnits(void)
{
  Serial.print(",248,""
  #ifdef FAHRENHEIT
  "F"
  #else
  "C"
  #endif
  """);  
}

void SerialDrawBorder(uint8_t height)
{
  if (height == 32) Serial.print(";sh0,0,128;sh0,31,128;sv0,1,30;sv127,1,30");
  else Serial.print(";sh0,0,128;sh0,63,128;sv0,1,62;sv127,1,62");
}

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(5000);  // 5 sec delay between DHT22 reads
#ifdef SERIAL_DEBUG
  swSerial.begin(115200);
  swSerialEcho = &swSerial;
#endif  
  pinMode(led, OUTPUT);
  wdt_enable(WDTO_8S);
}

void loop() {
  uint8_t i;
  static uint32_t last_millis = 0;
  static TS ts[TEMP_SENSORS];
  static HS hs[HUMIDITY_SENSORS];
 
  while (Serial.available()) Serial.read(); // Flush RX buffer
  Serial.println();
  if (SerialReadUntilDone()) {
  // First do a 1-Wire temperature measurement on all DS18B20 sensors
    SerialCmdDone(ONEWIRE_TEMP_CONVERSION);

  // Read the Si7020 humidity sensor
  if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM4)) {
  if (SerialCmdDone(HUMIDITY_SENSOR1)) {
        ReadHumiditySensor(&hs[0]);
  }
  }
  else init_oled[3] = true;

  // Read DHT22 humidity sensor every 2 seconds
  if (millis() - last_millis >= 2000) {
      SerialCmdDone(HUMIDITY_SENSOR2);
      ReadHumiditySensor(&hs[1]);
      last_millis = millis();
  }

  // Read 1-Wire temperature sensors
    ReadTempSensor(&ts[0], TEMP_SENSOR1);
    ReadTempSensor(&ts[1], TEMP_SENSOR2);
    ReadTempSensor(&ts[2], TEMP_SENSOR3);
    ReadTempSensor(&ts[3], TEMP_SENSOR4);

  if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM1)) {
  if (init_oled[0]) {
  if (SerialCmdNoError(INIT_OLED_SSD1306_32)) {
          init_oled[0] = false;
          ts[0].update = true;
  }
  }
  if (!init_oled[0] && ts[0].update) {
        SerialPrintDecimal("st10;sc;sf1;sa2;sd63,8,"", C2F(ts[0].temp), ts[0].error);
  if (!ts[0].error) SerialPrintUnits();
        SerialDrawBorder(32);
        SerialCmdDone(";sd");
        ts[0].update = false;
  }
  }
  else init_oled[0] = true;
 
  if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM2)) {
  if (init_oled[1]) {
  if (SerialCmdNoError(INIT_OLED_SSD1306_64)) {
          init_oled[1] = false;
          ts[1].update = true;
  }
  }
  if (!init_oled[1] && ts[1].update) {
        SerialPrintDecimal("st10;sc;sf2;sa2;sd63,19,"", C2F(ts[1].temp), ts[1].error);
  if (!ts[1].error) SerialPrintUnits();
        SerialDrawBorder(64);
        SerialCmdDone(";sd");
        ts[1].update = false;
  }
  }
  else init_oled[1] = true;

  if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM3)) {
  if (init_oled[2]) {
  if (SerialCmdNoError(INIT_OLED_SSD1106)) {
          init_oled[2] = false;
          ts[2].update = true;
  }
  }
  if (!init_oled[2] && ts[2].update) {
        SerialPrintDecimal("st13;sc;sf2;sa2;sd63,19,"", C2F(ts[2].temp), ts[2].error);
  if (!ts[2].error) SerialPrintUnits();
        SerialDrawBorder(64);
        SerialCmdDone(";sd");
        ts[2].update = false;
  }
  }
  else init_oled[2] = true;

  if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM4)) {
  if (init_oled[3]) {
  if (SerialCmdNoError(INIT_OLED_SSD1106)) {
          init_oled[3] = false;
          ts[3].update = true;
  }
  }
  if (!init_oled[3] && (ts[3].update || hs[0].update)) {
        SerialPrintDecimal("st13;sc;sf1;sa1;sd60,12,"", C2F(hs[0].temp), hs[0].error);
        SerialPrintUnits();
        SerialPrintDecimal(";sd60,32,"", hs[0].humidity, hs[0].error);
        Serial.print(","%"");
        SerialPrintDecimal(";sd121,12,"", C2F(ts[3].temp), ts[3].error);
        SerialPrintUnits();
        SerialDrawBorder(64);
        SerialCmdDone(";sd");
        ts[3].update = false;
        hs[0].update = false;
  }
  }
  else init_oled[3] = true;

  if (SerialCmdNoError(ONEWIRE_TO_I2C_ROM5)) {
  if (init_oled[4]) {
  if (SerialCmdNoError(INIT_OLED_SSD1309)) {
          init_oled[4] = false;
          hs[1].update = true;
  }
  }
  if (!init_oled[4] && hs[1].update) {
        SerialPrintDecimal("st10;sc;sf1;sa2;sd63,12,"", C2F(hs[1].temp), hs[1].error);
        SerialPrintUnits();
        SerialPrintDecimal(";sd63,32,"", hs[1].humidity, hs[1].error);
        Serial.print(","%"");
        SerialDrawBorder(64);
        SerialCmdDone(";sd");
        hs[1].update = false;
  }
  }
  else init_oled[4] = true;

#ifdef SERIAL_DEBUG
#endif  
  }
  else {
    digitalWrite(led, HIGH);  // blink Arduino led for IO Expander failure
    delay(500);
    digitalWrite(led, LOW);
    delay(500);

  for (i = 0; i < OLED_SCREENS; i++) init_oled[i] = true;
  }
  wdt_reset();
}

SSD1309 128x64 OLED 2.42"。

較大的 2.42" OLED 的文檔不好,所以我添加了一些關(guān)于如何正確使用1-Wire? 到 I2C適配器的附加信息。

顯示器默認為 SPI,因此您要做的第一件事就是將其轉(zhuǎn)換為 I2C。這意味著您需要取出烙鐵并移除并添加一些 SMD 0603 電阻器

pYYBAGNh7J2AMDbTAACS0fYwHaM279.jpg
?
  • 取下 R4 并將其放在 R3 上。
  • 在 R5 和 R7 處添加 0 歐姆電阻。
  • 將跳線添加到 CS-DS。這將有效地為 0x3C 的 I2C 地址選擇提供 GND DC。如果您想使用 0x3D 的備用 I2C 地址,請移除跳線并將 DC 連接到 VCC (3V3)。
  • 將一根電線從 RES 引腳連接到1-Wire? 到 I2C適配器上 PL1 (D2) 的未跳線引腳。這將用作 GPIO 線,以在 OLED 顯示器上電后發(fā)送所需的復位脈沖。

此顯示控制器需要在 VCC 穩(wěn)定后發(fā)送 RES 引腳上的復位脈沖。根據(jù)SSD1309 顯示控制器,您必須將 RES LOW 設置為至少 3us,然后再設置為 HIGH。在面板鎖定的情況下訪問此顯示器上的重置線也很有用,您可以在其中重置和重新初始化它,而無需關(guān)閉整個系統(tǒng)的電源。

要使用 IO 擴展器發(fā)送復位脈沖,請在所選引腳上使用 gpio 命令并指定持續(xù)時間。這里我們使用引腳 [1] 上的 [g]pio 命令作為 [0] 的 [o] 輸出或 [ 10]毫秒。持續(xù)時間之后,該引腳將保持高電平。

>g1o0,10
ok
>

較大的 2.42 OLED 顯示器使用一個簡單的內(nèi)部開關(guān)電容電荷泵,可將輸入的 3V3 轉(zhuǎn)換為 OLED 的 15V 高電壓驅(qū)動。顯示器平均從 3.3V 電源汲取約 50mA 電流,但所需的浪涌電流,特別是在較長的電纜長度上,需要在輸入 3V3 的 VCC 和 GND 之間添加一個額外的 470uF 電解電容器。確保將負極連接到 GND!如果您使用的是插頭連接器,只需將電容器插入引腳即可。

對于較小的 SSD1106 1.3",它還使用內(nèi)部電荷泵將輸入的 3V3 轉(zhuǎn)換為 7V 以驅(qū)動 OLED,因此對于更長的電纜長度,您還需要在輸入的 3V3 處添加一個額外的 100uF 電解電容器。該演示使用分路器作為 1-Wire? 短截線,將1-Wire? 到 I2C適配器連接到 OLED 顯示器和 I2C Si7021 傳感器。

分路器用作 D1 和 D2 上的兩個 1-Wire? 分接器,R1 和 R2 為 100Ω

pYYBAGNh7KOAQQ55AAAi1VJV2C0528.jpg
?

為了將盡可能多的 1-Wire? 傳感器連接到一根導線上,OLED 屏幕和傳感器作為短截線連接到 1-Wire? 總線,但在分支點存在阻抗不匹配。來自短截線末端的反射返回到主干線,僅延遲信號通過短截線長度所需的時間。這些反射可能會導致網(wǎng)絡上的其他從站出現(xiàn)問題。與短截線串聯(lián)的電阻器將降低失配的嚴重程度和反射能量的幅度。該電阻器減輕了主干上的短截線產(chǎn)生的反射的不利影響

可靠的長線 1-Wire? 網(wǎng)絡指南

1-Wire協(xié)議

為了有效地運行 OLED 顯示器,IO 擴展器支持在 100 英尺以上高達 75.47kHz 的主動驅(qū)動 1-Wire? Overdrive 速度!如果您需要走幾百英尺,那么您仍然可以退回到較慢的標準速度 15.38kHz。像 DS18B20 這樣的原生溫度傳感器不支持 Overdrive 速度,因此您可以混合具有不同速度的設備,IO 擴展器將自動改變速度以匹配同一 1-Wire 總線上的設備。Overdrive 速度低于連接到 OLED 屏幕的 I2C 總線上的 400kHz,但對于在傳感器位置報告?zhèn)鞲衅鳡顟B(tài)來說已經(jīng)足夠快了。

為了使用 Overdrive 速度,您必須在盡可能靠近 CPU IO 引腳的地方使用 2.2k 的強上拉電阻。在這個演示中,我們使用了帶有 2.2k 上拉電阻的引腳 4,但對于引腳 2,我們需要添加一個。最簡單的方法是在 IO 擴展器 PCB 底部端口的 RJ11 插頭上的引腳之間焊接一個 2.2k 0603 電阻。

pYYBAGNh7KmAQiPsAABJhwnjt0s259.jpg
?

IO 擴展器支持三種不同命令來控制 1-Wire? 設備。

o - [o] 線直接控制。
i - 1-Wire? [i]2c 控制。
t - 1-Wire? [t] 溫度傳感器。

在引腳 [4] 上的 [o]newire 總線上,[f]找到所有 ROM。

>o4f
28ffe835c3160376
28ffea20c316034c
28ff19f4c2160300
28fffd34c3160357
197a28030000002e
19ad200300000051
19ed200300000024
198f1103000000c0
>

[i] 2c 引腳 [4] 上的設備,[f] 查找所有 ROM。

>i4f
197a28030000002e
19ad200300000051
19ed200300000024
198f1103000000c0
>

[t] 引腳 [4] 上的溫度設備,[f] 找到所有 ROM。

>t4f
28ffe835c3160376
28ffea20c316034c
28ff19f4c2160300
28fffd34c3160357
>

那么使用IO Expander到底有多難呢?以身作則,自行判斷。

[t] 引腳 [4] 上的溫度傳感器 [s] 選擇 ROM [76]。執(zhí)行 [t] 溫度轉(zhuǎn)換 [t],最后執(zhí)行 [t] 溫度 [r] 讀取。

>t4s76;tt;tr
28ffe835c3160376
ok
17.9375
>

就這么容易!

可熱插拔!

IO 擴展器的獨特功能之一是它旨在支持熱插拔設備。這意味著,如果您的傳感器或 OLED 顯示屏出現(xiàn)故障,您無需關(guān)閉系統(tǒng)即可更換它。當它仍然通電時,移除 RJ11 插頭并重新連接新的傳感器或 OLED 屏幕。此外,為了實現(xiàn)這一點,您必須確保您的代碼已被編寫為檢測和重新初始化。一些傳感器沒有必要的保護,所以這樣做需要您自擔風險。任何 1-Wire 連接都應該沒問題,因為IO 擴展器上的 1-Wire 驅(qū)動程序是專門為支持這一獨特功能而編寫的。因此,立即獲取您的 IO 擴展器并構(gòu)建您的系統(tǒng)!


傳感器 OLED 擴展器
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1耗盡型MOS FET產(chǎn)品目錄選型表
  2. 0.14 MB   |  2次下載  |  免費
  3. 2TI系列-米爾TI AM62L核心板開發(fā)板-高能效低功耗嵌入式平臺
  4. 1.51 MB  |  次下載  |  免費
  5. 3WILLSEMI韋爾20年半年度報告由代理分銷經(jīng)銷一級代理分銷經(jīng)銷
  6. 3.30 MB  |  次下載  |  免費
  7. 4LRC 樂山無線電InTWSApplications家電由原廠代理分銷經(jīng)銷一級代理分銷經(jīng)銷供應
  8. 85.84 KB  |  次下載  |  免費
  9. 5LAT1596 一文說明白 STM32G4 雙 Bank 啟動與升級
  10. 0.64 MB   |  次下載  |  5 積分
  11. 6LAT1594_基于事件喚醒低功耗之介紹
  12. 0.37 MB   |  次下載  |  5 積分
  13. 7PT8P2309 觸控 A/D 型 8-Bit MCU規(guī)格書
  14. 4.05 MB   |  次下載  |  免費
  15. 8PT8P2308 觸控 A/D 型 8-Bit MCU規(guī)格書
  16. 4.13 MB   |  次下載  |  免費

本月

  1. 1美的電磁爐電路原理圖資料
  2. 4.39 MB   |  19次下載  |  10 積分
  3. 2反激式開關(guān)電源設計解析
  4. 0.89 MB   |  11次下載  |  5 積分
  5. 3耗盡型MOS FET產(chǎn)品目錄選型表
  6. 0.14 MB   |  2次下載  |  免費
  7. 4簡易光伏控制器原理圖資料
  8. 0.07 MB   |  1次下載  |  5 積分
  9. 52EDL05x06xx系列 600V半橋門驅(qū)動器帶集成自舉二極管(BSD)手冊
  10. 0.69 MB   |  1次下載  |  免費
  11. 6國產(chǎn)千兆網(wǎng)口芯片PT153S中文資料
  12. 1.35 MB   |  次下載  |  免費
  13. 7斯丹電子 | 用于芯片測試系統(tǒng)的射頻干簧繼電器
  14. 5.11 MB  |  次下載  |  免費
  15. 8SFI立昌ESD/TVS管原廠代理分銷經(jīng)銷一級代理分銷經(jīng)銷
  16. 294.76 KB  |  次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935137次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設計
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233095次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191448次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183360次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81605次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73829次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65991次下載  |  10 積分