在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發(fā)燒友App

硬聲App

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

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

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

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

2022-11-03 | zip | 0.50 MB | 次下載 | 免費(fèi)

資料介紹

描述

需要在距離您的項(xiàng)目太遠(yuǎn)的傳感器位置添加 OLED 屏幕以獲取有意義的報(bào)告?

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

需要多條 1-Wire? 總線?IO Expander最多可同時(shí)支持 16 個(gè)。

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

功能列表

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

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

接線圖

pYYBAGNh7HCAN2tkAAOFZpehZrM013.jpg
?

俯視圖

?
?

運(yùn)行此演示的 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適配器的附加信息

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

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

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

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

>g1o0,10
ok
>

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

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

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

pYYBAGNh7KOAQQ55AAAi1VJV2C0528.jpg
?

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

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

1-Wire協(xié)議

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

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

pYYBAGNh7KmAQiPsAABJhwnjt0s259.jpg
?

IO 擴(kuò)展器支持三種不同命令來(lái)控制 1-Wire? 設(shè)備。

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] 上的設(shè)備,[f] 查找所有 ROM。

>i4f
197a28030000002e
19ad200300000051
19ed200300000024
198f1103000000c0
>

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


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

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
主站蜘蛛池模板: 免费国产网站 | 亚洲免费视频网址 | 午夜免费啪视频观看网站 | 中文字幕一区2区3区 | 男人操女人的网站 | 精品福利在线视频 | 一级毛片真人免费播放视频 | 91精品国产免费久久久久久青草 | 91福利社在线观看 | 色婷婷激婷婷深爱五月老司机 | 一级黄色日本 | 黄在线观看在线播放720p | 手机看片自拍自自拍日韩免费 | 小毛片在线观看 | 色视频在线看 | 一级毛片免费不卡在线视频 | 在线a免费 | 白嫩美女一级高清毛片免费看 | 永久免费观看视频 | ts 人妖 另类 在线 | 精品一区二区在线观看 | 午夜国产片 | 亚洲美女视频一区 | 男人女人真曰批视频播放 | 国产成人毛片毛片久久网 | 亚洲国产精品热久久2022 | kkk4444免费观看 | 天天爽爽 | 天天靠天天擦天天摸 | 一级毛片视屏 | 午夜精品久久久久久99热 | 青娱乐99 | 老色鬼久久综合第一 | 香蕉视频网站在线播放 | 好大好硬好长好爽a网站 | 欧美白虎逼| 欧美日韩中文字幕 | 女毛片 | 日韩欧美亚洲综合久久影院d3 | 亚洲最色网 | 美女拍拍拍免费视频观看 |