從這個網站開始
事實證明,檢索有關打開啟動器的資訊的最方便的選項是使用 PC817 光耦合器的選項。 原理圖,示意圖該板包含三個相同的電路,所有東西都放置在尺寸為 100x100 毫米的 ABS 塑膠盒中。 光耦照片 當連接到帶有半導體閥的啟動裝置時,其漏電流足以打開PC817,並且計數器將錯誤觸發。 排除這樣的情況
接收部分製作在 側面 1側面 2開發板連接到 ARDUINO MEGA 2560。為此,末端使用雙排連接器。 資訊顯示設備採用解析度為240x400、電阻式觸控螢幕和溫度感測器的螢幕。 HX8352B。 此外,螢幕板上ICSP的連接器被移除,並且沒有使用micro SD插槽。 事實上,由於 SPI 總線上的衝突,「本機」SD 插槽無法使用。 對於快閃記憶體卡,使用單獨的讀卡器,其中包括3,3V穩定器和具有三種輸出狀態的緩衝晶片74LVS125A。 耙子就在這裡等我。 三態緩衝器,但 E01-ML01DP5 或讀卡機都可以工作。 在庫評論中,SdFat 看到了有關與其他設備不相容的警告。 TXS0108E 上的電平轉換器被移除並用跳線代替,因為E01-ML01DP5 可以耐受 5V 訊號 - 但沒有幫助。 當連接讀卡機時,使用示波器偵測到 MISO 線路上有訊號遺失。 仔細檢查發現,4LVS74A的OE 125通道的啟用訊號輸入只是簡單地焊接在一條公共線上,根本談不上第三種狀態。 緩衝晶片用作從 5V 到 3.3V 的原始電平轉換器,使用與訊號線串聯的 3,3 KΩ 電阻器。 除了味噌線。 它的輸出底部開關可能會將訊號吸引到接地電平。 確定 MISO 線的使能訊號為引腳 13 後,將其從軌道上斷開並焊接的9LVS74A CS 裝置選擇輸入接腳 (125) 和終端電阻之間。 現在,如果沒有存取記憶卡,MISO 緩衝區將被停用,並且不會幹擾其他裝置的操作。開發板圖接收器運作中DS3231 使用軟體 I2C 匯流排 (TWI) 連接時脈。
Arduino IDE 程式// 重要:Adafruit_TFTLCD 庫必須是特定的
// 配置為 TFT 屏蔽或分線板。
// 請參閱 Adafruit_TFTLCD.h 中的相關註解進行設定。
//由 Open-Smart 團隊和 Catalex 團隊提供
//[電子郵件保護]
//店鋪:
//
//Demo功能:顯示圖形、字符
//Arduino 整合開發環境:1.6.5
// 板:Arduino UNO R3、Arduino Mega2560、Arduino Leonardo
// 開發板:OPEN-SMART UNO R3 5V / 3.3V、Arduino UNO R3、Arduino Mega2560
//3.2吋TFT:
//
//OPEN-SMART UNO R3 5V / 3.3V:
//
#包括// 核心圖形庫
//#包括// 硬體特定庫
#包括
MCUFRIEND_kbv tft;
#include "SdFat.h" // 使用SdFat函式庫
SdFat SD;
SdFile 檔案;
文件我的文件;
#定義SD_CS_PIN SS
#包括// 連接庫以與 SPI 總線一起工作
#包括// 連接 RF24 庫中的設定文件
#包括// 連接庫以與 nRF24L24+ 搭配使用
RF24 無線電(47, 49);
#包括
DS3231 實時時鐘 (27, 25);
時間t;
uint16_t r = 6000;
uint32_t k = 0;
易失性無符號長資料;
浮動leb_1;
浮動leb_2;
浮動leb_3;
浮動leb_4;
uint8_t 管道;
int rc = 0;
uint8_t time_sec_prev;
uint8_t time_day_prev;
//************************************************ **** **************/ /
// 如果您使用 OPEN-SMART TFT 分線板 //
// 建議新增5V-3.3V電平轉換電路。
// 當然你可以使用有5V/3.3V電源開關的OPEN-SMART UNO Black版本,
//你只需切換到3.3V。
// LCD 的控制引腳可以分配給任何數字或
// 模擬引腳...但我們將使用模擬引腳,因為這允許我們
//——————————————-|
// TFT 分線 - Arduino UNO / Mega2560 / OPEN-SMART UNO 黑色
// 接地 - 接地
// 3V3 - 3.3V
//CS-A3
// RS-A2
// 寫-A1
// RD - A0
// RST-重置
// LED - 接地
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7
// 為一些常見的 16 位元顏色值指派人類可讀的名稱:
#定義黑色0x0000
#定義藍色0x001F
#定義紅色0xF800
#定義綠色0x07E0
#定義青色0x07FF
#定義洋紅色 0xF81F
#定義黃色0xFFE0
#定義白色0xFFFF
#定義灰色0x8C51
#定義格雷D 0x39E7
//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// 如果使用屏蔽,所有控制線和資料線都是固定的,並且
// 可以選擇使用更簡單的宣告:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;
字串資料字串;
//字串numfileMonth = "1.txt";
char perv[] = {"2.txt"};
//String *numfileMonth="1.txt"(sizeof(numfileMonth));
//////////////////////////////////////////////////// /////////////////
無效設置(無效){
rtc.begin();
// 若要設定時間,請取消註解必要的行
// rtc.setDOW(6); // 一週中的天
// rtc.setTime(22, 04, 0); // 時間,24 小時格式。
// rtc.setDate(4, 5, 2019); // 日期,29 年 2018 月 XNUMX 日
Serial.begin(2000000);
//////// 螢幕初始化
tft.開始(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(真);
//////////////////輸出名稱、裝置配件、組織名稱
tft.fillScreen(黑色);
tft.setTextColor(白色);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("開發人員與建置");
tft.setCursor(30, 20);
tft.print (utf8rus("建構子 V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("特納 I.I." ));
延遲(2000);
radio.begin(); // 啟動 nRF24L01+ 工作
無線電.setChannel(120); // 指定資料接收通道(從0到127)
radio.setDataRate(RF24_250KBPS); // 指定資料傳輸速率(RF24_250KBPS、RF24_1MBPS、RF24_2MBPS)、RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); //指定發射機功率(RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // 開啟1個管道,其識別碼為1個發送器0xAABBCCDD11,以接收資料
// 開啟發送器 ID 2xAABBCCDD2 的管道 0 來接收數據
radio.startListening(); // 開啟接收器,開始監聽開啟的管道
// radio.stopListening();
////////服務資訊輸出
tft.fillScreen(黑色);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////開始初始化SD卡
Serial.println("初始SD卡");
tft.println("初始SD卡");
tft.setCursor(8, 10);
////////卡初始化
如果(!SD.begin(SD_CS_PIN)){
Serial.println("初始化失敗!");
tft.fillRect(8, 10, 85, 7, 紅色);
tft.setTextColor(黑色);
tft.println("初始化失敗!");
返回;
}
tft.setTextColor(白色);
Serial.println("初始化完成");
tft.println("初始化完成");
延遲(2000);
////////讀取時間和日期並將它們分配給變量
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////強制輸出日期,以免等待日期變更顯示
tft.setCursor(180, 0); // 設定遊標位置
tft.fillRect(178, 0, 65, 7, 灰色); // 清空時間輸出區域
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////輸出控制物件的名稱
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("絞車 I"));
////////建立日誌檔案並輸出建立嘗試的結果
tft.setTextSize(1);
tft.setCursor(130, 10); // 如果建立了日誌檔案 2.txt,則將繼續寫入該文件
如果(SD.exists(perv)){
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} {
myFile = SD.open(perv, FILE_WRITE); // 如果檔案2.txt不存在,則建立它
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}
無效循環(無效){
////////檢查是否有向COM埠監視器輸出日誌的請求
if (Serial.available() > 0) {
if (1 == Serial.read());
////////如果接受“1”,則輸出
檔案 myFile = SD.open(perv);
// 如果檔案可用,則寫入:
如果(我的文件){
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
其他{
Serial.println("開啟.txt時發生錯誤");
}
}
////////閱讀時間
t = rtc.getTime();
tft.setTextColor(白色);
////////如果時間改變,則顯示新的時鐘讀數
if ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // 設定遊標位置
tft.fillRect(118, 0, 50, 7, 灰色); // 清空時間輸出區域
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); //輸出時鐘讀數
time_sec_prev = t.sec;
}
////////如果日期改變了,則顯示新日期
if ( time_day_prev != t.date) {
tft.setCursor(180, 0); // 設定遊標位置
tft.fillRect(178, 0, 65, 7, 灰色); // 清除日期顯示區域
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // 顯示日期讀數
time_day_prev = t.date;
}
////////如果無線電接收可用,則
if (radio.available(&pipe)) {
////////檢查接收緩衝區是否已滿,
radio.read(&data, sizeof(data));
////////如果所需的傳送器位址可用,則
如果(管道==1){
////////等待同步的零序列來決定
//資料塊的開始
如果(數據== 0000){
rc = 0;
} {
rc++;
}
////////記錄計數器值並以十分之一和百分之一小時計算它們
如果(rc==1){
leb_1 = 數據/3600.0;
}
如果(rc==2){
leb_2 = 數據/3600.0;
}
如果(rc==3){
leb_3 = 數據/3600.0;
}
如果(rc==4){
leb_4 = 數據/3600.0;
}
}
}
r++;
k++; // 只是一個計數器
//////// 以一定的週期進行資料更新
如果( r >= 6500){
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, 灰階);
Serial.println("Lebedki I");
tft.setCursor(0, 41);
tft.println(leb_1);
串列.println(leb_1);
tft.println(leb_2);
串列.println(leb_2);
tft.println(leb_3);
串列.println(leb_3);
tft.println(leb_4);
串列.println(leb_4);
串行.println(k);
r = 0;
}
////////每10分鐘將資料寫入SD上的日誌。
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(黑色);
////////建立.csv格式的字串
字串 dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+“,”+(leb_3)+“,”+(leb_4)+“,”;
////////寫入檔案並輸出寫入過程的結果
myFile = SD.open(perv, FILE_WRITE); // 如果不存在名為「2.txt」的文件,則會建立該文件。
如果(我的文件){
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, 綠色);
tft.println("SD 正常");
Serial.println("SD OK");
延遲(900); // 延遲,否則記錄 13 個相同的讀數,直到一秒過去
} {
tft.fillRect(198, 8, 42, 10, 紅色);
tft.println("SD 錯誤");
Serial.println("SD ERR");
}
}
}字元轉換程式/* 將俄文字型從 UTF-8 重新編碼為 Windows-1251 */
字串 utf8rus(字串來源)
{
整數 i,k;
字串目標;
無符號字元 n;
char m[2] = { '0', ' ' };
k = 源.length(); 我 = 0;
而(i<k){
n = 源[i]; 我++;
如果(n >= 0xC0){
開關(n){
情況 0xD0: {
n = 源[i]; 我++;
if (n == 0x81) { n = 0xA8; 休息; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
打破;
}
情況 0xD1: {
n = 源[i]; 我++;
if (n == 0x91) { n = 0xB8; 休息; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
打破;
}
}
}
m[0] = n; 目標=目標+字串(m);
}
返回目標;
}使用 Adafruit_GFX 函式庫進行西里爾文輸出的字元轉碼程式與主程式放在同一資料夾中。 您還需要使用不同的字體來替換 Adafruit_GFX 中的 glcdfont.c 檔案。
總而言之,我想說該系統沒有辜負期望,監控設備的運行時間變得更加容易。 儘管所有東西都是在麵包板上組裝的,但並沒有立即對這項工作提出抱怨。 第一批元件已經工作了六個多月,並且撐過了冬天。
來源: www.habr.com