Begin op deze website .
De meest handige manier om informatie over het inschakelen van de starter te verkrijgen, bleek de variant met de optocoupler PC817 te zijn. Principeschema
De boards bevatten elk drie identieke schema's, alles is ondergebracht in een ABS plastic behuizing van 100x100 mm. Foto van optocouplers
Bij aansluiting op de startapparaten met halfgeleider-schakelaars is hun lekstroom voldoende om de PC817 te activeren, wat kan leiden tot een vals alarm van de teller. Om deze situatie te voorkomen wordt er een extra LED toegevoegd in serie met de LED van de optocoupler en de indicatielamp. Hiervoor wordt de jumper J1 verbroken en een extra LED1 gesoldeerd.
Het ontvangstgedeelte is uitgevoerd op zijde 1
zijde 2
een prototype board dat is aangesloten op de ARDUINO MEGA 2560. Hiervoor wordt een dubbele connector aan de zijkant gebruikt. Het weergegeven informatieapparaat is een resistieve touchscreen met een temperatuursensor, met een resolutie van 240x400 HX8352B.
Bovendien is de connector naar de ICSP op het schermboard verwijderd en wordt de micro-SD-sleuf niet gebruikt. Het probleem is dat de "originele" SD-sleuf niet kan worden gebruikt vanwege conflicten op de SPI-bus. Voor de flashkaart werd een aparte kaartlezer gebruikt die een 3,3V stabilisator en een buffercircuit met drie uitgangstoestanden, de 74LVS125A, bevatte. Hier kwamen mijn problemen. De buffer met drie toestanden werkte, ofwel E01-ML01DP5 of de kaartlezer. In de opmerkingen van de SdFat-bibliotheek ontdekte ik een waarschuwing over incompatibiliteit met andere apparaten. De niveausconverter op de TXS0108E werd verwijderd en vervangen door jumpers, omdat E01-ML01DP5 tolerant is voor 5V signalen - dit hielp niet. Met behulp van een oscilloscoop werd vastgesteld dat het signaal op de MISO-lijn verdween bij aansluiting van de kaartlezer. Bij nader inzien werd vastgesteld dat de ingangen van de inschakelsignalen OE van de vier kanalen van de 74LVS125A simpelweg aan de gemeenschappelijke draad waren gesoldeerd en er was geen sprake van een derde toestand. De buffercircuit werd gebruikt als een primitieve niveaustransformer van 5V naar 3,3V met behulp van 3,3 kΩ weerstanden die in serie met de signaallijnen werden aangesloten, behalve de MISO-lijn. De uitgang van de onderste schakeling trok waarschijnlijk de signalen naar het niveau "aarde". Nadat was vastgesteld dat het inschakelsignaal voor de MISO-lijn output 13 was, werd deze van het pad losgesneden enaangesoldeerd
tussen de uitgang invoer (9) 74LVS125A apparaatkeuze CS en de aanpassingsweerstand. Nu, als er geen toegang is tot de geheugenkaart, wordt de MISO-buffer uitgeschakeld en verstoort dit de werking van een ander apparaat.Prototypingschema
Ontvanger in werking
Voor de verbinding van de klok met de DS3231 wordt de softwarebus I2C (TWI) gebruikt.
Arduino IDE programma// IMPORTANT: Adafruit_TFTLCD LIBRARY MUST BE SPECIFICALLY
// CONFIGURED FOR EITHER THE TFT SHIELD OR THE BREAKOUT BOARD.
// SEE RELEVANT COMMENTS IN Adafruit_TFTLCD.h FOR SETUP.
//by Open-Smart Team and Catalex Team
//catalex_inc@163.com
//Store:
//
//Demo Function: Display graphics, characters
//Arduino IDE: 1.6.5
// Board: Arduino UNO R3, Arduino Mega2560,Arduino Leonardo
// Board:OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//3.2INCH TFT:
//
//OPEN-SMART UNO R3 5V / 3.3V:
//
#include <Adafruit_GFX.h> // Core graphics library
//#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include «SdFat.h» // Use the SdFat library
SdFat SD;
SdFile bestand;
Bestand myFile;
#define SD_CS_PIN SS
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // Подключаем библиотеку для работы с nRF24L01+
RF24 radio(47, 49);
#include <DS3231.h>
DS3231 rtc(27, 25);
Time t;
uint16_t r = 6000;
uint32_t k = 0;
volatile unsigned long data;
float leb_1;
float leb_2;
float leb_3;
float leb_4;
uint8_t pipe;
int rc = 0;
uint8_t time_sec_prev;
uint8_t time_day_prev;
//***********************************************//
// If you use OPEN-SMART TFT breakout board //
// Reconmmend you to add 5V-3.3V level converting circuit.
// Of course you can use OPEN-SMART UNO Black version with 5V/3.3V power switch,
// you just need switch to 3.3V.
// The control pins for the LCD can be assigned to any digital or
// analog pins…but we’ll use the analog pins as this allows us to
//—————————————-|
// TFT Breakout — Arduino UNO / Mega2560 / OPEN-SMART UNO Black
// 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
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define GRAY 0x8C51
#define GRAYD 0x39E7
//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// If using the shield, all control and data lines are fixed, and
// a simpler declaration can optionally be used:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;
String dataString;
//String numfileMonth =«1.txt»;
char perv [] = {"2.txt"};
//String *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(true);
//////////////////Вывод имен, принадлежности оборудования, название организации
tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setTextSize(2);
tft.setCursor (8, 0);
tft.println ("DEVELOPERS & BUILD");
tft.setCursor (30, 20);
tft.print (utf8rus("Конструктор В.В."));
tft.setCursor (40, 40);
tft.print (utf8rus("Токарь И.И."));
delay (2000);
radio.begin(); // Start de werking van nRF24L01+
radio.setChannel(120); // Geef het kanaal voor gegevensontvangst op (van 0 tot 127)
radio.setDataRate (RF24_250KBPS); // Geef de datatransmissiesnelheid op (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel (RF24_PA_MAX); // Geef het zendvermogen op (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Open pijp 1 met zender ID 0xAABBCCDD11 om gegevens te ontvangen
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Zet de ontvanger aan, begin met het luisteren naar de geopende pijpen
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("Initial SD card");
tft.println("Initial SD card");
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("initial failed!");
tft.fillRect (8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("Initial failed!");
return;
}
tft.setTextColor(WHITE);
Serial.println("initialization done");
tft.println("Initialization done");
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor (180, 0); // Stel de positie van de cursor in
tft.fillRect (178, 0, 65, 7, GRAY); // Maak het tijdsweergavegebied schoon
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); // Als het logbestand 2.txt is aangemaakt, wordt de opname in het bestand voortgezet
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // Als bestand 2.txt niet bestaat, wordt het aangemaakt
myFile.close();
tft.println(perv);
Serial.println(perv);
}
}
void loop(void) {
////////Проверка существования запроса вывода лога в монитор СОМ- порта
if (Serial.available() > 0) {
if (1 == Serial.read());
////////И если принята «1»- то вывод
File myFile = SD.open(perv);
// if the file is available, write to it:
if (myFile) {
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
else {
Serial.println("error opening .txt");
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(WHITE);
////////Если время изменилось, то вывод новых показаний часов
if (time_sec_prev != t.sec) {
tft.setCursor (120, 0); // Stel de positie van de cursor in
tft.fillRect (118, 0, 50, 7, GRAY); // Maak het tijdsweergavegebied schoon
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // weergave van het tijdsresultaat
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if (time_day_prev != t.date) {
tft.setCursor (180, 0); // Stel de positie van de cursor in
tft.fillRect ( 178, 0, 65, 7, GRAY); // het wissen van het datumscherm
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // het weergeven van de datumsweergave
time_day_prev = t.date;
}
////////Если доступен радиоприём, то
if (radio.available(&pipe)) {
////////проверка заполнения буфера приёма,
radio.read(&data, sizeof(data));
////////если доступен нужный адрес передатчика, то
if (pipe == 1) {
////////ждём синхронизирующую последовательность нулей для определения
//начала блока данных
if ( data == 0000 ) {
rc = 0;
} else {
rc++;
}
////////Запись значений счётчиков и расчёт их в 10 и 100-х долях часа
if ( rc == 1 ) {
leb_1 = data / 3600.0;
}
if ( rc == 2 ) {
leb_2 = data / 3600.0;
}
if ( rc == 3 ) {
leb_3 = data / 3600.0;
}
if ( rc == 4 ) {
leb_4 = data / 3600.0;
}
}
}
r++;
k++; // gewoon een teller
//////// С определённой условием периодичностью обновление данных
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect ( 0, 41, 180, 64, GRAYD);
Serial.println («Lebedki 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(BLACK);
////////Создание строки в формате .csv
String dataString = String (rtc.getDateStr()) + «, «+(rtc.getTimeStr()) + «, » + (leb_1) + «, » + (leb_2)
+ «, » + (leb_3) + «, » + (leb_4) + «, «;
////////Запись в файл и вывод результатов процесса записи
myFile = SD.open(perv, FILE_WRITE); // als er geen bestand met de naam «2.txt» is, zal het worden aangemaakt.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); // vertraging, anders worden er 13 identieke gegevens geschreven terwijl de seconde nog niet om is
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Programma voor het hercoderen van tekens/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
int i,k;
String target;
unsigned char n;
char m[2] = { ‘0’, ‘ ‘ };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30; //0x2F
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB8; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70; //0x6F
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
} Het programma voor het hercoderen van tekens voor het weergeven van Cyrillisch met de Adafruit_GFX bibliotheek moet in dezelfde map worden geplaatst als het hoofdprogramma. Het bestand glcdfont.c moet ook worden vervangen door een ander lettertype. Een bibliotheek met de vereiste vervanging. Meer over het Russificeren is gemakkelijk te vinden op internet.
Samenvattend kan ik zeggen dat het systeem aan de verwachtingen heeft voldaan, het is gemakkelijker geworden om het gebruik van de apparatuur te volgen. Hoewel alles op breadboards is gemonteerd, zijn er geen dringende klachten over de werking. De eerste elementen functioneren al meer dan een half jaar en hebben de winter overleefd. werkt sinds 5 maart voor 9 gecontroleerde eenheden en er wordt al tijd geregistreerd.
Bron: habr.com
