Inicio en este sitio .
La opción más conveniente para obtener información sobre la activación del arranque fue la opción con el optoacoplador PC817. Esquema principal
Las placas contienen tres esquemas idénticos, todo está alojado en cajas de plástico ABS de 100x100 mm. Foto del optoacoplador
Al conectarse a los dispositivos de arranque con válvulas semiconductoras, su corriente de fuga es suficiente para activar el PC817 y esto causará un falso disparo del contador. Para evitar tal situación se debe añadir en serie al circuito del LED del optoacoplador y al LED indicador de funcionamiento otro LED adicional. Para esto, se debe desconectar el puente J1 y soldar un LED adicional LED1.
La parte receptora está realizada en lado 1
lado 2
una placa de pruebas conectada a ARDUINO MEGA 2560. Se utiliza un conector de dos filas en el extremo. Como dispositivo de visualización de información, se utiliza una pantalla táctil resistiva con un sensor de temperatura y una resolución de 240x400 HX8352B.
Además, el conector ICSP en la placa de la pantalla ha sido desmontado y no se utiliza el alojamiento para micro-SD. Esto se debe a que el alojamiento SD 'nativo' no se puede aplicar debido a un conflicto en el bus SPI. Para la tarjeta de memoria se utilizó un lector de tarjetas separado que cuenta con un regulador de 3.3V y un circuito de buffer con tres estados de salida 74LVS125A. Aquí me encontré con un problema. El buffer tenía tres estados, pero funcionaba ya sea E01-ML01DP5 o el lector de tarjetas. En los comentarios de la biblioteca SdFat vi una advertencia sobre la incompatibilidad con otros dispositivos. Se eliminó el convertidor de niveles TXS0108E y se reemplazó por puentes, ya que E01-ML01DP5 es tolerante a señales de 5V - no ayudó. Con un osciloscopio se detectó una pérdida de señal en la línea MISO al conectar el lector de tarjetas. Al inspeccionar detenidamente se determinó que las entradas de los señales habilitantes OE de los 4 canales del 74LVS125A estaban soldadas a un cable común y no podía haber un tercer estado. El circuito de buffer se utilizó como un conversor de niveles primitivo de 5V a 3.3V utilizando resistencias de 3.3 kΩ conectadas en serie con las líneas de señal. Excepto en la línea MISO. Su salida de llave inferior probablemente atraía señales al nivel de “tierra”. Al identificar que la señal habilitante en la línea MISO es el pin 13, fue desoldado de la pista yresoldado
entre la salida de entrada (9) 74LVS125A selección del dispositivo CS y el resistor de adaptación. Ahora, si no hay acceso a la tarjeta de memoria, el buffer MISO se desactiva y no interfiere con el funcionamiento de otro dispositivo.Esquema de la placa de prueba
Receptor en funcionamiento
Para conectar el reloj DS3231, se utiliza el bus I2C (TWI).
Programa Arduino IDE// 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 archivo;
Archivo 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);
Tiempo 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 ("DESARROLLADORES & CONSTRUCCIÓN");
tft.setCursor(30, 20);
tft.print(utf8rus("Constructor V.V."));
tft.setCursor(40, 40);
tft.print(utf8rus("Tornero I.I."));
delay(2000);
radio.begin(); // Iniciamos el funcionamiento del nRF24L01+
radio.setChannel(120); // Establecemos el canal para la recepción de datos (de 0 a 127)
radio.setDataRate(RF24_250KBPS); // Establecemos la velocidad de transmisión (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Establecemos la potencia del transmisor (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe(1, 0xAABBCCDD11LL); // Abrimos el pipe 1 con el identificador 1 transmisor 0xAABBCCDD11, para recibir datos
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening(); // Activamos el receptor, comenzamos a escuchar los pipes abiertos
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(BLACK);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println("Tarjeta SD inicial");
tft.println("Tarjeta SD inicial");
tft.setCursor(8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println("¡fallo en la inicialización!");
tft.fillRect(8, 10, 85, 7, RED);
tft.setTextColor(BLACK);
tft.println("¡fallo en la inicialización!");
return;
}
tft.setTextColor(WHITE);
Serial.println("inicialización completada");
tft.println("Inicialización completada");
delay(2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor(180, 0); // establecer la posición del cursor
tft.fillRect(178, 0, 65, 7, GRAY); // limpiar el área de salida del tiempo
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println(utf8rus("Poleas I"));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // si el archivo log 2.txt ha sido creado, la grabación en el archivo continuará
if (SD.exists(perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // si el archivo 2.txt no existe, será creado
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); // establecer la posición del cursor
tft.fillRect(118, 0, 50, 7, GRAY); // limpiar el área de salida del tiempo
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // mostrar la hora.
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if (time_day_prev != t.date) {
tft.setCursor(180, 0); // establecer la posición del cursor
tft.fillRect ( 178, 0, 65, 7, GRAY); \/\/ limpieza del área de salida de la fecha
tft.setTextSize(1);
tft.print(rtc.getDateStr()); \/\/ salida de la fecha
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 ++; \/\/ solo un contador
//////// С определённой условием периодичностью обновление данных
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); \/\/ si no hay archivo llamado «2.txt», se creará.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, GREEN);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); \/\/ retraso, de lo contrario escribe 13 lecturas idénticas hasta que pase un segundo
} else {
tft.fillRect ( 198, 8, 42, 10, RED);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Programa de recodificación de caracteres/* 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;
}El programa de recodificación de caracteres para la salida de caracteres cirílicos de la biblioteca Adafruit_GFX se coloca en la misma carpeta que el programa principal. También debe sustituirse el archivo glcdfont.c en Adafruit_GFX por otra fuente. biblioteca con el reemplazo necesario. Más información sobre la traducción al ruso se puede encontrar fácilmente en Internet.
En resumen, diré que el sistema ha cumplido con las expectativas, se ha vuelto más fácil seguir el tiempo de trabajo del equipo. Aunque todo está montado en placas de prototipo, hasta ahora no ha habido quejas sobre su funcionamiento. Los primeros elementos han estado funcionando durante más de seis meses y han sobrevivido al invierno. para 9 unidades controladas que ha estado funcionando desde el 5 de marzo y se está registrando el tiempo de trabajo oficialmente.
Fuente: habr.com
