Système local d’acquisition de données autonome (suite)

Commencez sur ce site lien.
L'option la plus pratique pour récupérer des informations sur la mise sous tension du démarreur s'est avérée être l'option avec l'optocoupleur PC817. Diagramme schématiqueSystème local d’acquisition de données autonome (suite)Les cartes contiennent trois circuits identiques, le tout est placé dans des boitiers en plastique ABS, dimension 100x100 mm. Photo d'optocoupleursSystème local d’acquisition de données autonome (suite) Lorsqu'ils sont connectés à des dispositifs de démarrage dotés de vannes à semi-conducteurs, leur courant de fuite est suffisant pour ouvrir le PC817 et le compteur se déclenchera faussement. Pour exclure une telle situation un autre est ajouté en série au circuit de la LED de l'optocoupleur et de la LED d'indication de fonctionnement. Pour ce faire, le cavalier J1 est ouvert et une LED LED1 supplémentaire est soudée.
La partie réceptrice est réalisée sur côté 1Système local d’acquisition de données autonome (suite)côté 2Système local d’acquisition de données autonome (suite)carte de développement connectée à ARDUINO MEGA 2560. Pour cela, un connecteur double rangée est utilisé à l'extrémité. Un écran d'une résolution de 240x400, doté d'un écran tactile résistif et d'un capteur de température, est utilisé comme dispositif d'affichage d'informations. HX8352B.Système local d’acquisition de données autonome (suite) De plus, le connecteur vers l'ICSP sur la carte écran est retiré et le slot micro SD n'est pas utilisé. Le fait est que le socket SD « natif » ne peut pas être utilisé en raison d'un conflit sur le bus SPI. Pour la carte flash, un lecteur de carte séparé a été utilisé, qui comprenait un stabilisateur de 3,3 V et une puce tampon à trois états de sortie 74LVS125A. C'est là que le râteau m'attendait. Un tampon à trois états, mais soit le E01-ML01DP5, soit le lecteur de carte ont fonctionné. Dans les commentaires de la bibliothèque, SdFat a vu un avertissement concernant l'incompatibilité avec d'autres appareils. Le convertisseur de niveau du TXS0108E a été retiré et remplacé par des cavaliers, car E01-ML01DP5 tolère les signaux 5V - cela n'a pas aidé. A l'aide d'un oscilloscope, une perte de signal a été détectée sur la ligne MISO lorsqu'un lecteur de carte était connecté. Après un examen attentif, il a été constaté que les entrées des signaux d'activation des canaux OE 4 du 74LVS125A étaient simplement soudées à un fil commun et qu'il ne pouvait être question d'un état tiers. La puce tampon a été utilisée comme convertisseur de niveau primitif de 5 V à 3.3 V utilisant des résistances de 3,3 KΩ connectées en série avec les lignes de signal. Sauf pour la ligne MISO. Son interrupteur inférieur de sortie attirait probablement des signaux vers le niveau du sol. Après avoir déterminé que le signal d'activation de la ligne MISO était la broche 13, celui-ci a été arraché de la piste etsoudéSystème local d’acquisition de données autonome (suite)entre la broche d'entrée de sélection du dispositif 9LVS74A CS (125) et la résistance de terminaison. Désormais, s'il n'y a pas d'accès à la carte mémoire, le tampon MISO est désactivé et n'interfère pas avec le fonctionnement d'un autre appareil.Schéma de la carte de développementSystème local d’acquisition de données autonome (suite)Récepteur en fonctionnementSystème local d’acquisition de données autonome (suite)Le DS3231 utilise un bus logiciel I2C (TWI) pour connecter l'horloge.
Programme IDE Arduino// IMPORTANT : LA BIBLIOTHÈQUE Adafruit_TFTLCD DOIT ÊTRE SPÉCIFIQUEMENT
// CONFIGURÉ POUR LE BOUCLIER TFT OU LA BREAKOUT BOARD.
// VOIR LES COMMENTAIRES PERTINENTS DANS Adafruit_TFTLCD.h POUR LA CONFIGURATION.
//par l'équipe Open-Smart et l'équipe Catalex
//[email protected]
//Magasin: dx.com
// open-smart.aliexpress.com/store/1199788
//Fonction démo : afficher des graphiques, des caractères
//IDE Arduino : 1.6.5
// Carte : Arduino UNO R3, Arduino Mega2560, Arduino Leonardo

// Carte : OPEN-SMART UNO R3 5V / 3.3V, Arduino UNO R3, Arduino Mega2560
//TFT 3.2 POUCES :
// 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
//OUVERT-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

#inclure // Bibliothèque graphique principale
//#inclure // Bibliothèque spécifique au matériel
#inclure
MCUFRIEND_kbv tft;
#include "SdFat.h" // Utiliser la bibliothèque SdFat
SDFat SD ;
Fichier SDFile ;
Fichier monFichier ;
#définir SD_CS_PIN SS

#inclure // Connectez la bibliothèque pour travailler avec le bus SPI
#inclure // Connecte le fichier de paramètres de la bibliothèque RF24
#inclure // Connectez la bibliothèque pour travailler avec nRF24L24+
Radio RF24(47, 49);

#comprendre

DS3231 RTC (27, 25) ;
Temps t ;

uint16_tr = 6000 ;
uint32_t k = 0 ;

données longues volatiles non signées ;
flotter leb_1;
flotter leb_2;
flotter leb_3;
flotter leb_4;

tuyau uint8_t ;
int rc = 0 ;

uint8_t time_sec_prev ;
uint8_t time_day_prev ;

//************************************************ ****************/ /
// Si vous utilisez une carte de dérivation OPEN-SMART TFT //
// Je vous recommande d'ajouter un circuit de conversion de niveau 5V-3.3V.
// Bien sûr, vous pouvez utiliser la version OPEN-SMART UNO Black avec interrupteur d'alimentation 5 V/3.3 V,
// il vous suffit de passer au 3.3V.
// Les broches de commande de l'écran LCD peuvent être affectées à n'importe quel numérique ou
// broches analogiques... mais nous utiliserons les broches analogiques car cela nous permet de
//—————————————-|
// TFT Breakout - Arduino UNO / Mega2560 / OPEN-SMART UNO Noir
// Masse - Masse
// 3V3 - 3.3V
//CS-A3
//RS-A2
// WR - A1
//RD-A0
// RST - RÉINITIALISATION
// LED - GND
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// Attribue des noms lisibles par l'homme à certaines valeurs de couleur 16 bits courantes :
#définir NOIR 0x0000
#définir BLEU 0x001F
#définir ROUGE 0xF800
#définir VERT 0x07E0
#définir CYAN 0x07FF
#définir MAGENTA 0xF81F
#define JAUNE 0xFFE0
#define BLANC 0xFFFF
#définir GRIS 0x8C51
#définir GRAYD 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Si vous utilisez le bouclier, toutes les lignes de contrôle et de données sont fixes, et
// une déclaration plus simple peut éventuellement être utilisée :
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

Chaîne dataString ;
//String numfileMonth = "1.txt";
char perv [] = {"2.txt"};
//String *numfileMonth="1.txt" (sizeof (numfileMonth));
///////////////////////////////////////////////////////// ///////////////////

configuration vide (void) {

rtc.begin();

// Pour régler l'heure, décommentez les lignes nécessaires
// rtc.setDOW(6); // Jour de la semaine
// rtc.setTime(22, 04, 0); // Heure, au format 24 heures.
// rtc.setDate(4, 5, 2019); // Date, 29 octobre 2018

Serial.begin (2000000);
//////// Initialisation de l'écran
tft.begin(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(vrai);
//////////////////Sortie des noms, accessoires d'équipement, nom de l'organisation
tft.fillScreen(NOIR);
tft.setTextColor(BLANC);
tft.setTextSize(2);
tft.setCursor(8, 0);
tft.println("DEVELOPPEURS ET CONSTRUCTION");
tft.setCursor(30, 20);
tft.print (utf8rus("Constructeur V.V." ));
tft.setCursor(40, 40);
tft.print (utf8rus("Turner I.I." ));
délai (2000);

radio.begin(); // Lancement du travail nRF24L01+
radio.setChannel(120); // Spécifiez le canal de réception des données (de 0 à 127)
radio.setDataRate(RF24_250KBPS); // Spécifiez le taux de transfert de données (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Mbit/s
radio.setPALevel(RF24_PA_MAX); // Spécifiez 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 tube avec l'identifiant d'1 émetteur 0xAABBCCDD11, pour recevoir des données
// Ouvrir le tuyau 2 avec l'ID d'émetteur 2xAABBCCDD0 pour recevoir des données
radio.startListening(); // Allumez le récepteur, commencez à écouter les tuyaux ouverts
// radio.stopListening();
////////Sortie des informations de service
tft.fillScreen(NOIR);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////Démarrer l'initialisation de la carte SD
Serial.println("Carte SD initiale");
tft.println("Carte SD initiale");
tft.setCursor(8, 10);
////////Initialisation de la carte
si (!SD.begin(SD_CS_PIN)) {
Serial.println("échec initial!");
tft.fillRect(8, 10, 85, 7, ROUGE);
tft.setTextColor(NOIR);
tft.println("Échec initial !");
retour;
}
tft.setTextColor(BLANC);
Serial.println("initialisation effectuée");
tft.println("Initialisation effectuée");
délai (2000);
////////Lecture de l'heure et de la date et leur affectation à des variables
t = rtc.getTime();
time_sec_prev = t.sec;
time_day_prev = t.date ;
////////Afficher de force la date afin de ne pas attendre que la date change pour l'afficher
tft.setCursor(180, 0); // définition de la position du curseur
tft.fillRect(178, 0, 65, 7, GRIS); // efface la zone de sortie temporelle
tft.setTextSize(1);
tft.print(rtc.getDateStr());
////////Afficher le nom des objets de contrôle
tft.setTextSize(2);
tft.setCursor(60, 25);
tft.println (utf8rus("Treuils I"));
////////Création d'un fichier journal et sortie du résultat de la tentative de création
tft.setTextSize(1);
tft.setCursor(130, 10); // si le fichier journal 2.txt est créé, l'écriture dans le fichier continuera
si (SD.existe (perv)) {
//tft.setCursor(0, 90);
tft.println(perv);
Serial.println(perv);
} Else {
monFichier = SD.open(perv, FILE_WRITE); // si le fichier 2.txt n'existe pas, il sera créé
monFichier.close();
tft.println(perv);
Serial.println(perv);
}
}

boucle vide (vide) {
////////Vérification de l'existence d'une demande de sortie d'un journal sur le moniteur du port COM
si (série.disponible() > 0) {
if (1 == Serial.read());
////////Et si « 1 » est accepté, alors la sortie
Fichier monFichier = SD.open(perv);
// si le fichier est disponible, écrivez-y :
si (monFichier) {
while (monFichier.disponible()) {
Serial.write(monFichier.read());
}
monFichier.close();
}
else {
Serial.println("erreur d'ouverture du fichier .txt");
}
}
////////Temps de lecture
t = rtc.getTime();
tft.setTextColor(BLANC);
////////Si l'heure a changé, affichez les nouvelles lectures de l'horloge
si ( time_sec_prev != t.sec) {
tft.setCursor(120, 0); // définition de la position du curseur
tft.fillRect(118, 0, 50, 7, GRIS); // efface la zone de sortie temporelle
tft.setTextSize(1);
tft.print(rtc.getTimeStr()); // lectures d'horloge de sortie
time_sec_prev = t.sec;
}
////////Si la date a changé, alors afficher la nouvelle date
si ( time_day_prev != t.date) {
tft.setCursor(180, 0); // définition de la position du curseur
tft.fillRect(178, 0, 65, 7, GRIS); // effacer la zone d'affichage de la date
tft.setTextSize(1);
tft.print(rtc.getDateStr()); // affiche les lectures de date
time_day_prev = t.date ;
}
////////Si la réception radio est disponible, alors
if (radio.available(&pipe)) {
////////vérifier si le tampon de réception est plein,
radio.read(&data, sizeof(data));
////////si l'adresse de l'émetteur requise est disponible, alors
si (tuyau == 1) {
////////attente d'une séquence de synchronisation de zéros pour déterminer
//début du bloc de données
si (données == 0000) {
RC = 0 ;
} Else {
RC++ ;
}
////////Enregistrer les valeurs des compteurs et les calculer en 10ème et 100ème d'heure
si (rc == 1) {
leb_1 = données / 3600.0 ;
}

si (rc == 2) {
leb_2 = données / 3600.0 ;
}

si (rc == 3) {
leb_3 = données / 3600.0 ;
}

si (rc == 4) {
leb_4 = données / 3600.0 ;
}
}
}
r++;
k++; // juste un compteur
//////// Mise à jour des données avec une certaine périodicité
si ( r >= 6500) {
tft.setTextSize(2);
tft.fillRect(0, 41, 180, 64, GRAYD);
Serial.println("Lebedki I");
tft.setCursor(0, 41);
tft.println(leb_1);
Série.println(leb_1);
tft.println(leb_2);
Série.println(leb_2);
tft.println(leb_3);
Série.println(leb_3);
tft.println(leb_4);
Série.println(leb_4);
Série.println(k);
r = 0 ;
}
////////Écrivez les données dans le journal sur SD toutes les 10 minutes.
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(NOIR);
////////Création d'une chaîne au format .csv
Chaîne dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+ ", " + (leb_3) + ", " + (leb_4) + ", ";
////////Écrire dans un fichier et afficher les résultats du processus d'écriture
monFichier = SD.open(perv, FILE_WRITE); // s'il n'y a pas de fichier nommé « 2.txt », il sera créé.
si (monFichier) {
monFichier.println(dataString);
monFichier.close();
tft.fillRect(198, 8, 42, 10, VERT);
tft.println("SD OK");
Serial.println("SD OK");
retard (900); // délai, sinon enregistre 13 lectures identiques jusqu'à ce qu'une seconde se soit écoulée
} Else {
tft.fillRect(198, 8, 42, 10, ROUGE);
tft.println("SD ERR");
Serial.println("SD ERR");
}
}
}Programme de conversion de caractères/* Recoder les polices russes d'UTF-8 vers Windows-1251 */

Chaîne utf8rus (source de la chaîne)
{
int je,k;
Cible de chaîne ;
caractère non signé n ;
char m[2] = { '0', ' ' };

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

tandis que (je < k) {
n = source[je]; je++;

si (n >= 0xC0) {
commutateur (n) {
cas 0xD0 : {
n = source[je]; je++;
si (n == 0x81) { n = 0xA8; casser; }
si (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
break;
}
cas 0xD1 : {
n = source[je]; je++;
si (n == 0x91) { n = 0xB8; casser; }
si (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
break;
}
}
}
m[0] = n; cible = cible + Chaîne(m);
}
objectif de retour ;
}Le programme de transcodage de caractères pour la sortie cyrillique utilisant la bibliothèque Adafruit_GFX est placé dans le même dossier que le programme principal. Vous devez également remplacer le fichier glcdfont.c dans Adafruit_GFX par une police différente. il est bibliothèque avec le remplacement requis. Plus d'informations sur la russification peuvent être facilement trouvées sur Internet.
Pour résumer, je dirai que le système a répondu aux attentes, il est devenu plus facile de suivre le temps de fonctionnement des équipements. Même si tout est assemblé sur des maquettes, il n’y a aucune plainte immédiate concernant le travail. Les premiers éléments fonctionnent depuis plus de six mois et ont résisté à l'hiver. Dernière conception Depuis le 9 mars, 5 unités contrôlées fonctionnent et la durée de fonctionnement est officiellement enregistrée.

Source: habr.com

Ajouter un commentaire