Орон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл)

Энэ сайтаас эхэл холбоос.
Стартерийг асаах тухай мэдээллийг олж авах хамгийн тохиромжтой сонголт бол PC817 оптокоуплерийн сонголт байв. Бүдүүвч диаграммОрон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл)Самбарууд нь гурван ижил хэлхээг агуулдаг бөгөөд бүх зүйл нь 100x100 мм хэмжээтэй ABS хуванцар хайрцагт байрладаг. Оптокоуплерын зурагОрон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл) Хагас дамжуулагч хавхлагатай асаах төхөөрөмжүүдэд холбогдсон үед тэдгээрийн алдагдал гүйдэл нь PC817-г нээхэд хангалттай бөгөөд тоолуур нь худал өдөөх болно. Ийм нөхцөл байдлыг үгүйсгэхийн тулд Оптокоуплерийн LED болон үйл ажиллагааны заагч LED-ийн хэлхээнд нэгийг нь цувралаар нэмсэн. Үүнийг хийхийн тулд J1 холбогч нээгдэж, нэмэлт LED LED1 гагнаж байна.
Хүлээн авах хэсэг нь дээр хийгдсэн тал 1Орон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл)тал 2Орон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл)ARDUINO MEGA 2560-д холбогдсон хөгжүүлэлтийн самбар. Үүний тулд төгсгөлд нь хоёр эгнээний холбогчийг ашигладаг. Мэдээллийг харуулах төхөөрөмж болгон 240x400 нягтралтай, эсэргүүцэл мэдрэгчтэй, температур мэдрэгчтэй дэлгэцийг ашигладаг. HX8352B.Орон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл) Түүгээр ч зогсохгүй дэлгэцийн самбар дээрх ICSP-ийн холбогчийг салгаж, микро SD үүрийг ашиглахгүй байна. SPI автобусны зөрчилдөөний улмаас "уугуул" SD залгуурыг ашиглах боломжгүй байгаа нь баримт юм. Флаш картын хувьд тусдаа карт уншигч ашигласан бөгөөд үүнд 3,3V тогтворжуулагч, 74LVS125A гурван гаралтын төлөвтэй буфер чип багтсан. Энд тармуур намайг хүлээж байсан. Гурван төлөвтэй буфер боловч E01-ML01DP5 эсвэл карт уншигч ажиллаж байсан. Номын сангийн тайлбар дээр SdFat бусад төхөөрөмжтэй нийцэхгүй байгаа тухай анхааруулгыг харсан. TXS0108E дээрх түвшний хөрвүүлэгчийг арилгаж, холбогчоор сольсон, учир нь E01-ML01DP5 нь 5V дохиог тэсвэрлэдэг - энэ нь тус болсонгүй. Осциллограф ашиглан карт уншигч холбогдсон үед MISO шугам дээр дохионы алдагдлыг илрүүлсэн. Нарийвчилсан шалгалтын үр дүнд 4LVS74A-ийн OE 125 сувгийн идэвхжүүлэх дохионы оролтыг энгийн утсанд гагнаж, гуравдагч төлөв байдлын талаар ярих боломжгүй болохыг тогтоожээ. Буфер чипийг дохионы шугамтай цуваа холбосон 5 КОм резистор ашиглан 3.3V-ээс 3,3V хүртэл анхдагч түвшний хувиргагч болгон ашигласан. MISO шугамаас бусад нь. Түүний гаралтын доод унтраалга нь газрын түвшинд дохио татсан байх. MISO шугамын идэвхжүүлэх дохио нь 13-р зүү болохыг тогтоосны дараа түүнийг замаас таслав.гагнасанОрон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл)9LVS74A CS төхөөрөмжийн хооронд оролтын зүү (125) болон төгсгөлийн эсэргүүцлийг сонгоно. Одоо санах ойн карт руу нэвтрэх эрх байхгүй бол MISO буфер идэвхгүй болж, өөр төхөөрөмжийн үйл ажиллагаанд саад болохгүй.Хөгжлийн самбарын диаграмОрон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл)Хүлээн авагч ажиллаж байнаОрон нутгийн бие даасан мэдээлэл цуглуулах систем (үргэлжлэл)DS3231 нь цагийг холбохын тулд програм хангамжийн I2C автобус (TWI) ашигладаг.
Arduino IDE програм// ЧУХАЛ: Adafruit_TFTLCD НОМЫН САН ТУСГАЙ БАЙХ ЁСТОЙ.
// TFT SHIELD ЭСВЭЛ ТАЛДАХ ЗӨВЛӨГТ ТОХИРУУЛСАН.
// ХОЛБОГДОХ СЭТГЭЛЭГТИЙГ Adafruit_TFTLCD.h-с ТОХИРУУЛАХЫГ ХАРАХ.
//Open-Smart Team болон Catalex Team
//[имэйлээр хамгаалагдсан]
//Дэлгүүр: dx.com
// open-smart.aliexpress.com/store/1199788
//Үзүүлэх функц: График, тэмдэгтүүдийг харуулах
//Arduino IDE: 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:
// www.aliexpress.com/store/product/3-2-TFT-LCD-Display-module-Touch-Screen-Shield-board-onboard-temperature-sensor-w-Touch-Pen/1199788_32755473754.html?spm=2114.12010615.0.0.bXDdc3
//НЭЭЛТТЭЙ-SMART UNO R3 5V / 3.3V:
// www.aliexpress.com/store/product/OPEN-SMART-5V-3-3V-Compatible-UNO-R3-CH340G-ATMEGA328P-Development-Board-with-USB-Cable-for/1199788_32758607490.html?spm=2114.12010615.0.0.ckMTaN

#оруулна // Үндсэн график номын сан
//# оруулах // Техник хангамжийн тусгай номын сан
#оруулна
MCUFRIEND_kbv tft;
#include "SdFat.h" // SdFat номын санг ашиглах
SdFat SD;
SdFile файл;
myFile файл;
#SD_CS_PIN SS-г тодорхойлох

#оруулна // SPI автобустай ажиллахын тулд номын санг холбоно уу
#оруулна // RF24 номын сангаас тохиргооны файлыг холбоно уу
#оруулна // nRF24L24+-тэй ажиллахын тулд номын санг холбоно уу
RF24 радио(47, 49);

#оруулна

DS3231 rtc(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 Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Хар
// GND - GND
// 3V3 - 3.3V
//CS - A3
// RS - A2
// WR - A1
// RD - A0
// RST - RESET
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Зарим нийтлэг 16 битийн өнгөний утгуудад хүний ​​унших боломжтой нэрийг оноох:
#ХАР 0x0000-г тодорхойлно
#ЦЭНХЭР 0x001F-г тодорхойлох
#RED 0xF800-г тодорхойлох
#НОГООН 0x07E0-г тодорхойлох
#CYAN 0x07FF-г тодорхойлох
#MAGENTA 0xF81F-г тодорхойлох
#ШАР 0xFFE0-г тодорхойлно
#ЦАГААН 0xFFFF-г тодорхойлох
# GREY 0x8C51-г тодорхойлно
# GRAYD 0x39E7-г тодорхойлох

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Хэрэв бамбай ашиглаж байгаа бол бүх хяналтын болон өгөгдлийн шугамууд тогтмол байна, мөн
// илүү энгийн мэдэгдлийг сонголтоор ашиглаж болно:
// Adafruit_TFTLCD tft;
uint16_t g_идентификатор;

DataString мөр;
//Мөр numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//Мөр *numfileMonth="1.txt" (sizeof (numfileMonth));
///////////////////////////////////////////////////////// /////////////////

хүчингүй тохиргоо (хүчингүй) {

rtc.begin();

// Цагийг тохируулахын тулд шаардлагатай мөрүүдийн тайлбарыг арилгана уу
// rtc.setDOW(6); // Долоо хоногийн өдөр
// rtc.setTime(22, 04, 0); // Цаг, 24 цагийн форматаар.
// rtc.setDate(4, 5, 2019); // Огноо, 29 оны 2018-р сарын XNUMX

Цуваа.begin (2000000);
//////// Дэлгэц эхлүүлэх
tft.begin(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("Constructor V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
саатал (2000);

radio.begin(); // nRF24L01+ ажлыг эхлүүлэх
radio.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); // Өгөгдлийг хүлээн авахын тулд 1xAABBCCDD1 дамжуулагчийн танигчтай 0 хоолойг нээнэ үү.
// Өгөгдөл хүлээн авахын тулд дамжуулагч ID 2xAABBCCDD2-тай хоолойг нээнэ үү
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(BLACK);
tft.println("Анхны үйлдэл амжилтгүй боллоо!");
буцах;
}
tft.setTextColor(ЦАГААН);
Serial.println("эхлүүлэх ажиллагаа хийгдсэн");
tft.println("Эхлүүлэх ажиллагаа хийгдсэн");
саатал (2000);
////////Цаг, огноог уншиж, хувьсагчид оноох
t = rtc.getTime();
prev_sec_prev = t.sec;
цаг_өдөр_өмнөх = t.огноо;
////////Огноог харуулахын тулд огноог өөрчлөхийг хүлээхгүйн тулд огноог хүчээр гарга
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("Winches I"));
////////Лог файл үүсгэж, үүсгэх оролдлогын үр дүнг гаргах
tft.setTextSize(1);
tft.setCursor(130, 10); // хэрвээ лог файл 2.txt үүсгэсэн бол файл руу бичих ажил үргэлжилнэ
хэрэв (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // хэрэв 2.txt файл байхгүй бол түүнийг үүсгэнэ
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}

хоосон давталт (хүчингүй) {
////////COM портын монитор руу лог гаргах хүсэлт байгаа эсэхийг шалгаж байна
хэрэв (Serial.available() > 0) {
хэрэв (1 == Serial.read());
////////Хэрэв “1”-ийг хүлээн авбал гаралт
Файл myFile = SD.open(perv);
// хэрэв файл байгаа бол түүнд бичнэ үү:
хэрэв (myFile) {
байхад (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
өөр {
Serial.println(".txt нээх алдаа");
}
}
////////Унших цаг
t = rtc.getTime();
tft.setTextColor(ЦАГААН);
////////Хэрэв цаг өөрчлөгдсөн бол шинэ цагийн заалтыг харуулна уу
хэрэв (time_sec_prev != t.sec) {
tft.setCursor(120, 0); // курсорын байрлалыг тохируулах
tft.fillRect(118, 0, 50, 7, СААРАЛ); // цаг гаралтын хэсгийг цэвэрлэх
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // гаралтын цагийн уншилт
prev_sec_prev = t.sec;
}
////////Хэрэв огноо өөрчлөгдсөн бол шинэ огноог харуулна уу
хэрэв (цаг_өдөр_өмнөх != t.огноо) {
tft.setCursor(180, 0); // курсорын байрлалыг тохируулах
tft.fillRect(178, 0, 65, 7, СААРАЛ); // огноог харуулах хэсгийг арилгах
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // огнооны уншилтыг харуулах
цаг_өдөр_өмнөх = t.огноо;
}
////////Хэрэв радио хүлээн авах боломжтой бол
хэрэв (radio.available(&pipe)) {
////////хүлээн авах буфер дүүрсэн эсэхийг шалгах,
radio.read(&өгөгдөл, sizeof(өгөгдөл));
////////хэрэв шаардлагатай дамжуулагчийн хаяг байгаа бол
хэрэв (хоолой == 1) {
////////тодорхойлох тэгийн синхрончлолын дарааллыг хүлээж байна
//өгөгдлийн блокийн эхлэл
хэрэв (өгөгдөл == 0000) {
rc = 0;
} else {
rc++;
}
////////Тоолуурын утгыг бүртгэж, цагийн 10, 100-д ​​тооцох
хэрэв (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, GRAYD);
Serial.println("Лебедки I");
tft.setCursor(0, 41);
tft.println(leb_1);
Serial.println(leb_1);
tft.println(leb_2);
Serial.println(leb_2);
tft.println(leb_3);
Serial.println(leb_3);
tft.println(leb_4);
Serial.println(leb_4);
Serial.println(k);
r = 0;
}
////////10 минут тутамд SD дээрх бүртгэлд өгөгдөл бичнэ.
хэрэв ((t.min % 10 == 0) && ( т.сек == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(BLACK);
////////.csv форматаар мөр үүсгэх
Мөр dataString = Мөр (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Файлд бичиж, бичих процессын үр дүнг гаргана
myFile = SD.open(perv, FILE_WRITE); // “2.txt” нэртэй файл байхгүй бол түүнийг үүсгэнэ.
хэрэв (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, НОГООН);
tft.println("SD OK");
Serial.println("SD OK");
саатал(900); // саатал, эс бөгөөс секунд өнгөрөх хүртэл 13 ижил заалтыг бичнэ
} else {
tft.fillRect(198, 8, 42, 10, УЛААН);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Тэмдэгт хувиргах програм/* Орос фонтыг UTF-8-аас Windows-1251 болгон дахин кодлох */

String utf8rus(Мөр эх сурвалж)
{
int i,k;
Мөрний зорилт;
unsigned char n;
char m[2] = { '0', ' ' };

k = source.length(); i = 0;

байхад (би <к) {
n = эх сурвалж[i]; i++;

хэрэв (n >= 0xC0) {
солих (n) {
тохиолдол 0xD0: {
n = эх сурвалж[i]; i++;
хэрэв (n == 0x81) { n = 0xA8; завсарлага; }
хэрэв (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
эвдэж,
}
тохиолдол 0xD1: {
n = эх сурвалж[i]; i++;
хэрэв (n == 0x91) { n = 0xB8; завсарлага; }
хэрэв (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
эвдэж,
}
}
}
m[0] = n; зорилтот = зорилт + мөр (м);
}
буцах зорилт;
}Adafruit_GFX номын санг ашиглан кирилл үсгийн гаралтын тэмдэгтийн кодыг өөрчлөх програмыг үндсэн програмтай нэг хавтсанд байрлуулсан. Та Adafruit_GFX дээрх glcdfont.c файлыг өөр фонтоор солих шаардлагатай. энд шаардлагатай солих номын сан. Оросжуулалтын талаарх дэлгэрэнгүй мэдээллийг интернетээс хялбархан олж болно.
Товчхондоо, систем нь хүлээлтийг хангаж, тоног төхөөрөмжийн ашиглалтын хугацааг хянах нь илүү хялбар болсон гэж би хэлэх болно. Хэдийгээр бүх зүйлийг талхны хавтан дээр угсардаг ч ажлын талаар шууд гомдол байдаггүй. Эхний элементүүд зургаан сар гаруй ажиллаж, өвлийг давсан. Хамгийн сүүлийн үеийн загвар Гуравдугаар сарын 9-наас эхлэн 5 удирдлагатай нэгжээр ажиллаж, ашиглалтын хугацааг албан ёсоор бүртгэж байна.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх