Локална автономна система за събиране на данни (продължение)

Започнете от този сайт по ссылке.
Най-удобният вариант за извличане на информация за включване на стартера се оказа вариантът с оптрона PC817. Схема на веригаЛокална автономна система за събиране на данни (продължение)Платките съдържат три еднакви вериги, всичко е поставено в ABS пластмасови кутии с размери 100х100 мм. Снимка на оптрониЛокална автономна система за събиране на данни (продължение) Когато са свързани към стартови устройства с полупроводникови вентили, техният ток на утечка е достатъчен, за да отвори PC817 и броячът ще се задейства фалшиво. За да се изключи подобна ситуация още един се добавя последователно към веригата на светодиода на оптрона и светодиода за индикация на работа. За да направите това, джъмперът J1 се отваря и се запоява допълнителен светодиод LED1.
Приемащата част е изработена на страна 1Локална автономна система за събиране на данни (продължение)страна 2Локална автономна система за събиране на данни (продължение)развойна платка, свързана към ARDUINO MEGA 2560. За това в края се използва двуредов конектор. Като устройство за показване на информация се използва екран с резолюция 240x400, имащ резистивен сензорен екран и температурен сензор. HX8352B.Локална автономна система за събиране на данни (продължение) Освен това конекторът към ICSP на платката на екрана е премахнат и слотът за micro SD не се използва. Факт е, че „родният“ SD гнездо не може да се използва поради конфликт на SPI шината. За флаш картата е използван отделен четец на карти, който включва 3,3V стабилизатор и буферен чип с три изходни състояния 74LVS125A. Тук ме чакаше рейка. Буфер с три състояния, но или E01-ML01DP5, или четецът на карти работеха. В коментарите на библиотеката SdFat видя предупреждение за несъвместимост с други устройства. Преобразувателят на ниво на TXS0108E беше премахнат и заменен с джъмпери, т.к E01-ML01DP5 е толерантен към 5V сигнали - не помогна. С помощта на осцилоскоп беше открита загуба на сигнал на линията MISO, когато беше свързан четец на карти. При внимателно изследване беше установено, че входовете на разрешаващите сигнали на OE 4 канала на 74LVS125A са просто запоени към общ проводник и не може да се говори за трето състояние. Буферният чип беше използван като примитивен преобразувател на ниво от 5V до 3.3V, използвайки резистори от 3,3 KΩ, свързани последователно със сигналните линии. С изключение на линията MISO. Неговият изходен долен превключвател вероятно е привлякъл сигнали към нивото на земята. След като установи, че активиращият сигнал на линията MISO е щифт 13, той беше откъснат от пистата изапоениЛокална автономна система за събиране на данни (продължение)между входния щифт за избор на устройство 9LVS74A CS (125) и крайния резистор. Сега, ако няма достъп до картата с памет, MISO буферът е деактивиран и не пречи на работата на друго устройство.Диаграма на платката за развитиеЛокална автономна система за събиране на данни (продължение)Приемник в действиеЛокална автономна система за събиране на данни (продължение)DS3231 използва софтуерна I2C шина (TWI) за свързване на часовника.
Arduino IDE програма// ВАЖНО: БИБЛИОТЕКАТА Adafruit_TFTLCD ТРЯБВА ДА БЪДЕ СПЕЦИАЛНО
// КОНФИГУРИРАН ИЛИ ЗА TFT ЩИТА, ИЛИ ЗА БЪРДАТА.
// ВИЖТЕ СЪОТВЕТНИТЕ КОМЕНТАРИ В 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
//OPEN-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;
#define SD_CS_PIN SS

#включи // Свързване на библиотеката за работа със SPI шината
#включи // Свържете файла с настройки от библиотеката RF24
#включи // Свързване на библиотеката за работа с nRF24L24+
RF24 радио (47, 49);

#включи

DS3231 rtc(27, 25);
Време t;

uint16_t r = 6000;
uint32_t k = 0;

летливи неподписани дълги данни;
float leb_1;
float leb_2;
float leb_3;
float leb_4;

uint8_t тръба;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//************************************************ ****************/ /
// Ако използвате OPEN-SMART TFT пробивна платка //
// Препоръчваме ви да добавите верига за преобразуване на ниво 5V-3.3V.
// Разбира се, можете да използвате OPEN-SMART UNO черна версия с 5V/3.3V ключ за захранване,
// просто трябва да превключите на 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 - НУЛИРАНЕ
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Присвояване на четими от човека имена на някои често срещани 16-битови цветови стойности:
#define ЧЕРНО 0x0000
#define СИН 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define МАГЕНТА 0xF81F
#define ЖЪЛТО 0xFFE0
#define WHITE 0xFFFF
#define СИВО 0x8C51
#define СИВО 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Ако използвате щита, всички линии за управление и данни са фиксирани и
// по избор може да се използва по-проста декларация:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

String dataString;
//Низ numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//Низ *numfileMonth="1.txt" (sizeof (numfileMonth));
//////////////////////////////////////////////////// /////////////////

void setup (void) {

rtc.begin();

// За да зададете времето, разкоментирайте необходимите редове
// rtc.setDOW(6); // Ден от седмицата
// rtc.setTime(22, 04, 0); // Време, в 24-часов формат.
// rtc.setDate(4, 5, 2019); // Дата, 29 октомври 2018 г

Serial.begin (2000000);
//////// Инициализация на екрана
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(вярно);
///////////////////Извеждане на имена, аксесоари за оборудване, име на организация
tft.fillScreen(ЧЕРНО);
tft.setTextColor(WHITE);
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("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); // Отворете 1 тръба с идентификатора на 1 предавател 0xAABBCCDD11, за да получите данни
// Отворете канал 2 с идентификатор на предавател 2xAABBCCDD0, за да получите данни
radio.startListening(); // Включете приемника, започнете да слушате отворени тръби
// radio.stopListening();
////////Извеждане на сервизна информация
tft.fillScreen(ЧЕРНО);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Започнете да инициализирате SD картата
Serial.println("Първоначална SD карта");
tft.println("Първоначална SD карта");
tft.setCursor(8, 10);
////////Инициализиране на картата
if (!SD.begin(SD_CS_PIN)) {
Serial.println("неуспешно първоначално!");
tft.fillRect(8, 10, 85, 7, ЧЕРВЕНО);
tft.setTextColor(ЧЕРНО);
tft.println("Първоначалното неуспешно!");
се върнат;
}
tft.setTextColor(WHITE);
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("Winches I"));
////////Създаване на лог файл и извеждане на резултата от опита за създаване
tft.setTextSize(1);
tft.setCursor(130, 10); // ако се създаде лог файл 2.txt, записът във файла ще продължи
if (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);
}
}

цикъл void (void) {
////////Проверка на съществуването на заявка за извеждане на журнал към монитора на COM порта
if (Serial.available() > 0) {
if (1 == Serial.read());
////////И ако се приеме „1“, тогава изходът
Файл myFile = SD.open(perv);
// ако файлът е наличен, пишете в него:
if (myFile) {
докато (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
още {
Serial.println("грешка при отваряне на .txt");
}
}
////////Време за четене
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Ако времето се е променило, покажете новите показания на часовника
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(&данни, sizeof(данни));
////////ако необходимият адрес на предавателя е наличен, тогава
ако (тръба == 1) {
////////изчакване на синхронизираща последователност от нули за определяне
//началото на блока с данни
ако (данни == 0000) {
rc = 0;
} Още {
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, СИВО);
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;
}
////////Записвайте данни в регистрационния файл на SD на всеки 10 минути.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(ЧЕРНО);
////////Създаване на низ във формат .csv
Низ dataString = Низ (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Записване във файл и извеждане на резултатите от процеса на писане
myFile = SD.open(perv, FILE_WRITE); // ако няма файл с име “2.txt”, той ще бъде създаден.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, ЗЕЛЕНО);
tft.println("SD OK");
Serial.println("SD OK");
забавяне (900); // забавяне, в противен случай записва 13 идентични показания, докато не измине една секунда
} Още {
tft.fillRect(198, 8, 42, 10, ЧЕРВЕНО);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Програма за конвертиране на знаци/* Прекодирайте руските шрифтове от UTF-8 към Windows-1251 */

Низ utf8rus (източник на низ)
{
int i,k;
Целеви низ;
неподписан знак n;
char m[2] = { '0', ' ' };

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

докато (i < k) {
n = източник[i]; i++;

if (n >= 0xC0) {
превключвател (n) {
case 0xD0: {
n = източник[i]; i++;
if (n == 0x81) { n = 0xA8; прекъсване; }
ако (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
почивка;
}
case 0xD1: {
n = източник[i]; i++;
if (n == 0x91) { n = 0xB8; прекъсване; }
ако (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
почивка;
}
}
}
m[0] = n; цел = цел + низ (m);
}
цел за връщане;
}Програмата за транскодиране на знаци за извеждане на кирилица с помощта на библиотеката Adafruit_GFX се поставя в същата папка с основната програма. Също така трябва да замените файла glcdfont.c в Adafruit_GFX с различен шрифт. Тук библиотека с необходимата замяна. Повече информация за русификацията можете лесно да намерите в Интернет.
Обобщавайки, ще кажа, че системата оправда очакванията, стана по-лесно да се следи времето за работа на оборудването. Въпреки че всичко е сглобено на breadboards, няма незабавни оплаквания относно работата. Първите елементи работят повече от шест месеца и са оцелели през зимата. Последен дизайн Работи за 9 контролирани блока от 5 март и официално се регистрира времето за работа с него.

Източник: www.habr.com

Добавяне на нов коментар