本地自主数据采集系统(续)

从这个网站开始 链接.
事实证明,检索有关打开启动器的信息的最方便的选项是使用 PC817 光耦合器的选项。 示意图本地自主数据采集系统(续)该板包含三个相同的电路,所有东西都放置在尺寸为 100x100 毫米的 ABS 塑料盒中。 光耦照片本地自主数据采集系统(续) 当连接到带有半导体阀的启动装置时,其漏电流足以打开PC817,并且计数器将错误触发。 排除这样的情况 在光耦LED和运行指示LED的电路中再串联一个。 为此,需要打开跳线 J1,并焊接一个额外的 LED LED1。
接收部分制作于 侧面 1本地自主数据采集系统(续)侧面 2本地自主数据采集系统(续)开发板连接到 ARDUINO MEGA 2560。为此,末端使用双排连接器。 信息显示设备采用分辨率为240x400、电阻式触摸屏和温度传感器的屏幕。 HX8352B。本地自主数据采集系统(续) 此外,屏幕板上ICSP的连接器被移除,并且没有使用micro SD插槽。 事实上,由于 SPI 总线上的冲突,“本机”SD 插槽无法使用。 对于闪存卡,使用单独的读卡器,其中包括3,3V稳定器和具有三种输出状态的缓冲芯片74LVS125A。 耙子就在这里等我。 三态缓冲器,但 E01-ML01DP5 或读卡器都可以工作。 在库评论中,SdFat 看到了有关与其他设备不兼容的警告。 TXS0108E 上的电平转换器被移除并用跳线代替,因为E01-ML01DP5 可以耐受 5V 信号 - 但没有帮助。 当连接读卡器时,使用示波器检测到 MISO 线路上存在信号丢失。 仔细检查发现,4LVS74A的OE 125通道的使能信号输入只是简单地焊接在一根公共线上,根本谈不上第三种状态。 缓冲芯片用作从 5V 到 3.3V 的原始电平转换器,使用与信号线串联的 3,3 KΩ 电阻器。 除了味噌线。 它的输出底部开关可能将信号吸引到地电平。 确定 MISO 线的使能信号为引脚 13 后,将其从轨道上断开并焊接的本地自主数据采集系统(续)9LVS74A CS 器件选择输入引脚 (125) 和终端电阻之间。 现在,如果没有访问存储卡,MISO 缓冲区将被禁用,并且不会干扰其他设备的操作。开发板图本地自主数据采集系统(续)接收器运行中本地自主数据采集系统(续)DS3231 使用软件 I2C 总线 (TWI) 连接时钟。
Arduino IDE 程序// 重要提示:Adafruit_TFTLCD 库必须是特定的
// 配置为 TFT 屏蔽或分线板。
// 请参阅 Adafruit_TFTLCD.h 中的相关注释进行设置。
//由 Open-Smart 团队和 Catalex 团队提供
//[电子邮件保护]
//店铺: dx.com
// open-smart.aliexpress.com/store/1199788
//Demo功能:显示图形、字符
//Arduino 集成开发环境: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 文件;
文件我的文件;
#定义SD_CS_PIN SS

#包括// 连接库以与 SPI 总线一起工作
#包括// 连接 RF24 库中的设置文件
#包括// 连接库以与 nRF24L24+ 配合使用
RF24 无线电(47, 49);

#包括

DS3231 实时时钟 (27, 25);
时间t;

uint16_t r = 6000;
uint32_t k = 0;

易失性无符号长数据;
浮动leb_1;
浮动leb_2;
浮动leb_3;
浮动leb_4;

uint8_t 管道;
int rc = 0;

uint8_t time_sec_prev;
uint8_t time_day_prev;

//**************************************************** **************/ /
// 如果您使用 OPEN-SMART TFT 分线板 //
// 建议添加5V-3.3V电平转换电路。
// 当然你可以使用带有5V/3.3V电源开关的OPEN-SMART UNO Black版本,
//你只需切换到3.3V。
// LCD 的控制引脚可以分配给任何数字或
// 模拟引脚...但我们将使用模拟引脚,因为这允许我们
//——————————————-|
// TFT 分线 - Arduino UNO / Mega2560 / OPEN-SMART UNO 黑色
// 接地 - 接地
// 3V3 - 3.3V
//CS-A3
// RS-A2
// 写-A1
// RD - A0
// RST-重置
// LED - 接地
// DB0 - 8
// DB1 - 9
// DB2 - 10
// DB3 - 11
// DB4 - 4
// DB5 - 13
// DB6 - 6
// DB7 - 7

// 为一些常见的 16 位颜色值分配人类可读的名称:
#定义黑色0x0000
#定义蓝色0x001F
#定义红色0xF800
#定义绿色0x07E0
#定义青色0x07FF
#定义洋红色 0xF81F
#定义黄色0xFFE0
#定义白色0xFFFF
#定义灰色0x8C51
#定义格雷D 0x39E7

//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// 如果使用屏蔽,所有控制线和数据线都是固定的,并且
// 可以选择使用更简单的声明:
// Adafruit_TFTLCD tft;
uint16_t g_identifier;

字符串数据字符串;
//字符串numfileMonth = "1.txt";
char perv[] = {"2.txt"};
//String *numfileMonth="1.txt"(sizeof(numfileMonth));
///////////////////////////////////////////////// /////////////////

无效设置(无效){

rtc.begin();

// 要设置时间,请取消注释必要的行
// rtc.setDOW(6); // 一周中的天
// rtc.setTime(22, 04, 0); // 时间,24 小时格式。
// rtc.setDate(4, 5, 2019); // 日期,29 年 2018 月 XNUMX 日

Serial.begin(2000000);
//////// 屏幕初始化
tft.开始(0x65);
tft.reset();
tft.setRotation(0);
tft.cp437(真);
//////////////////输出名称、设备配件、组织名称
tft.fillScreen(黑色);
tft.setTextColor(白色);
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("特纳 I.I." ));
延迟(2000);

radio.begin(); // 启动 nRF24L01+ 工作
无线电.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,以接收数据
// 打开发送器 ID 2xAABBCCDD2 的管道 0 来接收数据
radio.startListening(); // 打开接收器,开始监听打开的管道
// radio.stopListening();
////////服务信息输出
tft.fillScreen(黑色);
tft.setCursor(8, 0);
tft.setTextSize(1);
////////开始初始化SD卡
Serial.println("初始SD卡");
tft.println("初始SD卡");
tft.setCursor(8, 10);
////////卡初始化
如果(!SD.begin(SD_CS_PIN)){
Serial.println("初始化失败!");
tft.fillRect(8, 10, 85, 7, 红色);
tft.setTextColor(黑色);
tft.println("初始化失败!");
返回;
}
tft.setTextColor(白色);
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("绞车 I"));
////////创建日志文件并输出创建尝试的结果
tft.setTextSize(1);
tft.setCursor(130, 10); // 如果创建了日志文件 2.txt,则将继续写入该文件
如果(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);
}
}

无效循环(无效){
////////检查是否存在向COM端口监视器输出日志的请求
如果(Serial.available()> 0){
if (1 == Serial.read());
////////如果接受“1”,则输出
文件 myFile = SD.open(perv);
// 如果文件可用,则写入:
如果(我的文件){
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
}
其他{
Serial.println("打开.txt时出错");
}
}
////////阅读时间
t = rtc.getTime();
tft.setTextColor(白色);
////////如果时间改变,则显示新的时钟读数
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(&data, sizeof(data));
////////如果所需的发送器地址可用,则
如果(管道==1){
////////等待同步的零序列来确定
//数据块的开始
如果(数据== 0000){
rc = 0;
} {
rc++;
}
////////记录计数器值并以十分之一和百分之一小时计算它们
如果(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("Lebedki I");
tft.setCursor(0, 41);
tft.println(leb_1);
串行.println(leb_1);
tft.println(leb_2);
串行.println(leb_2);
tft.println(leb_3);
串行.println(leb_3);
tft.println(leb_4);
串行.println(leb_4);
串行.println(k);
r = 0;
}
////////每10分钟将数据写入SD上的日志。
if ((t.min % 10 == 0) && ( t.sec == 0)) {
tft.setTextSize(1);
tft.setCursor(200, 10);
tft.setTextColor(黑色);
////////创建.csv格式的字符串
字符串 dataString = String (rtc.getDateStr()) + ", "+(rtc.getTimeStr()) + ", " + (leb_1) + ", " + (leb_2)
+“,”+(leb_3)+“,”+(leb_4)+“,”;
////////写入文件并输出写入过程的结果
myFile = SD.open(perv, FILE_WRITE); // 如果不存在名为“2.txt”的文件,则会创建该文件。
如果(我的文件){
myFile.println(dataString);
myFile.close();
tft.fillRect(198, 8, 42, 10, 绿色);
tft.println("SD 正常");
Serial.println("SD OK");
延迟(900); // 延迟,否则记录 13 个相同的读数,直到一秒过去
} {
tft.fillRect(198, 8, 42, 10, 红色);
tft.println("SD 错误");
Serial.println("SD ERR");
}
}
}字符转换程序/* 将俄语字体从 UTF-8 重新编码为 Windows-1251 */

字符串 utf8rus(字符串源)
{
整数 i,k;
字符串目标;
无符号字符 n;
char m[2] = { '0', ' ' };

k = 源.length(); 我 = 0;

而(i<k){
n = 源[i]; 我++;

如果(n >= 0xC0){
开关(n){
情况 0xD0: {
n = 源[i]; 我++;
if (n == 0x81) { n = 0xA8; 休息; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;//0x2F
打破;
}
情况 0xD1: {
n = 源[i]; 我++;
if (n == 0x91) { n = 0xB8; 休息; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;//0x6F
打破;
}
}
}
m[0] = n; 目标=目标+字符串(m);
}
返回目标;
}使用 Adafruit_GFX 库进行西里尔文输出的字符转码程序与主程序放在同一文件夹中。 您还需要使用不同的字体替换 Adafruit_GFX 中的 glcdfont.c 文件。 这是 具有所需替换的库。 有关俄罗斯化的更多信息可以在互联网上轻松找到。
总而言之,我想说该系统没有辜负期望,监控设备的运行时间变得更加容易。 尽管所有东西都是在面包板上组装的,但并没有立即对这项工作提出抱怨。 第一批元件已经工作了六个多月,并且熬过了冬天。 最新设计 自9月5日起,已运行XNUMX台受控机组,运行时间正在正式登记中。

来源: habr.com

添加评论