Système autonome local de collecte de données (suite)

Début sur ce site via le lien.
La méthode la plus pratique pour récupérer des informations sur l'activation du démarreur s'est révélée être l'utilisation d'une optocoupleur PC817. Schéma principalSystème autonome local de collecte de données (suite)Les cartes contiennent trois schémas identiques, le tout étant placé dans des boîtiers en plastique ABS de taille 100x100 mm. Photo des optocoupleursSystème autonome local de collecte de données (suite) Lors de la connexion à des démarreurs avec des relais semiconducteurs, leur courant de fuite est suffisant pour activer le PC817, entraînant un déclenchement erroné du compteur. Pour éviter cette situation, on ajoute en série dans le circuit de la LED de l'optocoupleur et la LED d'indication de fonctionnement une autre LED. Pour ce faire, le pont J1 est déconnecté et une LED supplémentaire LED1 est soudée.
La partie réception est réalisée sur côté 1Système autonome local de collecte de données (suite)côté 2Système autonome local de collecte de données (suite)une carte de prototypage connectée à l'ARDUINO MEGA 2560. Un connecteur à deux rangées est utilisé à l'extrémité. Comme dispositif d'affichage d'information, un écran à tactile resistif et un capteur de température avec une résolution de 240x400 est utilisé. HX8352B.Système autonome local de collecte de données (suite) De plus, le connecteur ICSP sur la carte de l'écran a été démonté et le slot pour micro-SD n'est pas utilisé. Cela est dû au fait que le slot SD « d'origine » ne peut pas être utilisé en raison d'un conflit sur le bus SPI. Un lecteur de carte distinct a été appliqué pour la carte flash, comprenant un régulateur de 3,3 V et un circuit tampon à trois états de sortie 74LVS125A. C'est ici que les complications ont commencé. Le tampon à trois états fonctionnait soit avec E01-ML01DP5 soit avec le lecteur de carte. Dans les commentaires de la bibliothèque SdFat, j'ai repéré un avertissement d'incompatibilité avec d'autres dispositifs. Le convertisseur de niveaux TXS0108E a été retiré et remplacé par des ponts, car l'E01-ML01DP5 tolère les signaux de 5V - cela n'a pas aidé. À l'aide d'un oscilloscope, un manque de signal sur la ligne MISO a été identifié lors de la connexion du lecteur de carte. En y regardant de plus près, il a été établi que les entrées des signaux de validation OE des 4 canaux 74LVS125A étaient simplement soudées à la masse, ce qui empêchait l'existence d'un troisième état. Le circuit intégré tampon était utilisé comme un simple convertisseur de niveaux de 5V à 3,3V à l'aide de résistances de 3,3 kΩ connectées en série avec les lignes de signal, sauf pour la ligne MISO. Sa sortie inférieure attirait probablement les signaux vers le niveau « terre ». Ayant déterminé que le signal de validation de la ligne MISO est la broche 13, celle-ci a été détachée de la piste etsoudée.Système autonome local de collecte de données (suite)entre la sortie d'entrée (9) 74LVS125A choix de l'appareil CS et le résistor d'adaptation. Maintenant, s'il n'y a pas d'accès à la carte mémoire, le buffer MISO est désactivé et n'interfère pas avec le fonctionnement d'un autre appareil.Schéma de la carte de prototypeSystème autonome local de collecte de données (suite)Récepteur en fonctionnementSystème autonome local de collecte de données (suite)Pour connecter l'horloge sur DS3231, le bus I2C (TWI) est utilisé.
Programme 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: dx.com
// open-smart.aliexpress.com/store/1199788
//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:
// 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

#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 fichier;
Fichier 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(NOIR);
tft.setTextColor(BLANC);
tft.setTextSize(2);
tft.setCursor (8, 0);
tft.println («DÉVELOPPEURS & CONSTRUCTEURS» );
tft.setCursor (30, 20);
tft.print (utf8rus(«Constructor V.V.» ));
tft.setCursor (40, 40);
tft.print (utf8rus(«Tourneur I.I.» ));
delay (2000);

radio.begin(); // Nous démarrons le fonctionnement du nRF24L01+
radio.setChannel(120); // Définir le canal de réception des données (de 0 à 127)
radio.setDataRate (RF24_250KBPS); // Définir le taux de transmission des données (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS — 1Mbit/s
radio.setPALevel (RF24_PA_MAX); // Définir la puissance de l'émetteur (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Ouvrir 1 tuyau avec l'identifiant 1 de l'émetteur 0xAABBCCDD11, pour recevoir des données
// Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
radio.startListening (); // Activer le récepteur, commencer à écouter les tuyaux ouverts
// radio.stopListening ();
////////Вывод служебной информации
tft.fillScreen(NOIR);
tft.setCursor (8, 0);
tft.setTextSize(1);
////////Начало инициализации SD карты
Serial.println(«Initialisation de la carte SD»);
tft.println(«Initialisation de la carte SD»);
tft.setCursor (8, 10);
////////Инициализация карты
if (!SD.begin(SD_CS_PIN)) {
Serial.println(«échec de l'initialisation!»);
tft.fillRect ( 8, 10, 85, 7, ROUGE);
tft.setTextColor(NOIR);
tft.println(«échec de l'initialisation!»);
return;
}
tft.setTextColor(BLANC);
Serial.println(«initialisation terminée»);
tft.println(«Initialisation terminée»);
delay (2000);
////////Считывание времени- даты и присвоение их переменным
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date;
////////Вывод даты принудительно, что б не ждать смены даты для индикации
tft.setCursor ( 180, 0 ); // positionnement du curseur
tft.fillRect ( 178, 0, 65, 7, GRIS); // nettoyage de la zone d’affichage du temps
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Вывод названия объектов контроля
tft.setTextSize(2);
tft.setCursor (60, 25);
tft.println (utf8rus(«Treuils I»));
////////Создание файла лога и вывод результата попытки создания
tft.setTextSize(1);
tft.setCursor(130, 10); // si le fichier log 2.txt est créé, l'écriture dans le fichier continuera
if (SD.exists (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} else {
myFile = SD.open(perv, FILE_WRITE); // si le fichier 2.txt n'existe pas, il sera créé
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(«erreur lors de l'ouverture du .txt»);
}
}
////////Считывание времени
t = rtc.getTime();
tft.setTextColor(BLANC);
////////Если время изменилось, то вывод новых показаний часов
if ( time_sec_prev != t.sec) {
tft.setCursor ( 120, 0 ); // positionnement du curseur
tft.fillRect ( 118, 0, 50, 7, GRIS); // nettoyage de la zone d’affichage du temps
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // affichage des horaires
time_sec_prev = t.sec;
}
////////Если дата изменилась, то вывод новой даты
if ( time_day_prev != t.date) {
tft.setCursor ( 180, 0 ); // positionnement du curseur
tft.fillRect ( 178, 0, 65, 7, GRIS); \/\/ effacer la zone d'affichage de la date
tft.setTextSize(1);
tft.print(rtc.getDateStr()); \/\/ afficher les données de la date
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 ++; \/\/ juste un compteur
//////// С определённой условием периодичностью обновление данных
if ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect ( 0, 41, 180, 64, GRIS_D);
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(NOIR);
////////Создание строки в формате .csv
String dataString = String (rtc.getDateStr()) + «, «+(rtc.getTimeStr()) + «, » + (leb_1) + «, » + (leb_2)
+ «, » + (leb_3) + «, » + (leb_4) + «, «;
////////Запись в файл и вывод результатов процесса записи
myFile = SD.open(perv, FILE_WRITE); \/\/ si le fichier nommé «2.txt» n'existe pas, il sera créé.
if (myFile) {
myFile.println(dataString);
myFile.close();
tft.fillRect ( 198, 8, 42, 10, VERT);
tft.println(«SD OK»);
Serial.println(«SD OK»);
delay (900); \/\/ délai, sinon enregistre 13 lectures identiques tant que la seconde n'est pas écoulée
} else {
tft.fillRect ( 198, 8, 42, 10, ROUGE);
tft.println(«SD ERR»);
Serial.println(«SD ERR»);
}
}
}Programme de recodage de caractères/* Recode russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
int i,k;
String cible;
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; cible = cible + String(m);
}
return cible;
} Le programme de recodage des caractères pour afficher le cyrillique avec la bibliothèque Adafruit_GFX doit être placé dans le même dossier que le programme principal. Il faut aussi remplacer le fichier glcdfont.c dans Adafruit_GFX par une autre police. Ici bibliothèque avec le remplacement requis. Plus d'informations sur la russification se trouvent facilement sur Internet.
En résumé, je dirais que le système a tenu ses promesses, il est devenu plus facile de suivre le temps de fonctionnement de l'équipement. Bien que tout soit assemblé sur des plaques prototypes, il n'y a pas de plaintes urgentes concernant son fonctionnement. Les premiers éléments fonctionnent depuis plus de six mois et ont survécu à l'hiver. La dernière construction pour 9 unités contrôlées est en service depuis le 5 mars et le temps de fonctionnement est désormais officiellement enregistré.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster