在一些项目中,有必要监测照明水平、温度、环境 pH 值、湿度和其他数量等变量。
在这个过程中,经常需要在空间/环境的不同点监测一定数量的样本。我们可以举例说明房间的照明。
根据灯具的布局,房间内某些地方的照明可能会有所不同。所以我们可以有几个亮度值。
考虑到这一点,需要开发一个系统,能够收集数据并将其存储在存储卡上。其目的是在每个分析点执行多个样本并将数据存储在SD 卡上。
为此,我们将使用Arduino和SD 卡来获取数据并存储在存储卡中。
现在,我们将介绍整个项目结构。
通过图 1 所示的电路,可以看到用于构建项目的所有设备。
通过电路,我们使用了三个LED 。每个LED代表系统的特定状态。下文将根据每个LED呈现每个功能:
该系统的工作非常简单!在进行无效设置之前,系统会初始化SD 卡,如果未连接,系统将激活红色LED以指示设备中的SD 卡故障。用户需要连接 SD 卡并重置系统。红色 LED 如图 2 所示。
SD卡验证通过后,系统会进行初始化,一直按下按钮,系统会采集模拟A0引脚的10个值并存储在SD卡中。
此时,黄色LED将向用户发出系统正在收集数据的信息,如图 3 所示。
收集数据后,黄色LED将关闭,绿色 LED 将激活以指示过程完成,如图 4 所示。
此时,系统等待关闭或用户再次按下按钮,将存储十个以上的值。
下文将介绍用于创建此项目的所有代码。
下面给出了所有代码,但将解释代码的每个部分。在第一部分,包括所有库,项目中使用的所有引脚将定义并创建项目的所有变量。
#include
#include
File myFile;
#define RedLED 6
#define GreenLED 7
#define YellowLED 8
#define button 9
#define AnalogPin A0
int pinoSS = 10; // Pin 53 para Mega / Pin 10 para UNO
unsigned long int tempo_atual = 0; //Variable used to store the current time of code execution
unsigned long ultimo_tempo = 0; //Variable used to store the last value stored in the variable tempo_atual
int DigitalValue = 0;
byte samples = 0, value = 0; //Sample is a variable to count until 10 and value is used count the number of times that user store 10 samples
bool ButtonControl = 0, control = 0;
在设置功能中,所有使用的引脚都根据每个连接设备的功能配置为输出和输入。此后,系统将尝试初始化SD 卡。如果出现任何问题,红色LED将被激活。
void setup()
{
Serial.begin(9600); // Define BaundRate
pinMode(RedLED, OUTPUT);
pinMode(GreenLED, OUTPUT);
pinMode(YellowLED, OUTPUT);
pinMode(pinoSS, OUTPUT); // Pin pinoSS like a output
if (SD.begin())
{ // Inicializa o SD Card
Serial.println("SD Card pronto para uso."); // Imprime na tela
}
else
{
Serial.println("Falha na inicialização do SD Card.");
digitalWrite(RedLED, HIGH);
return;
}
}
因此,在循环功能中,将读取按钮的引脚。如果按下按钮,则第一个条件为真。
if(pino == 1 && control == 0 && ButtonControl == 0)
将打开文本文件 silicioslab.txt。并且会打印出消息“Sample:”,后面跟着值,表示十个样本的读数序列数。
在第一个条件下观察变量 ButtonControl 将收到值 1。该变量将用于使系统进入第二个条件。
if((ButtonControl == 1) && (tempo_atual - ultimo_tempo >= 1000) && samples < 10 && control == 1)
第二个条件将被执行,数字值将被读取并保存在SD 卡上。它将被读取 10 个值。
当读数值等于 10 时,第二个条件为假。
此时,第三个条件为真,绿色LED将被激活,文件将被关闭。
void loop()
{
bool pino = digitalRead(button);
//Condicao para detectar quando o botao e pressionado
if(pino == 1 && control == 0 && ButtonControl == 0)
{
myFile = SD.open("silicioslab.txt", FILE_WRITE); // Create/Open File the txt
delay(500);
ButtonControl = 1;
value++;
myFile.print("sample: ");
myFile.println(value);
samples = 0;
}
tempo_atual = millis();
if((ButtonControl == 1) && (tempo_atual - ultimo_tempo >= 1000) && samples < 10 && control == 1)
{
DigitalValue = analogRead(AnalogPin);
myFile.println(DigitalValue);
control = 0;
ultimo_tempo = tempo_atual;//Store the actual time
samples++;
digitalWrite(YellowLED, HIGH);
}
if(samples >= 10)
{
digitalWrite(YellowLED, LOW);
myFile.close();
ButtonControl = 0;
digitalWrite(GreenLED, HIGH);
}
control = control ^ 1;
}
此后,系统等待用户再次按下按钮。如果该按钮被按下,将再次进行新的块经常读取。
因此,该系统简单,可以在多个项目中实施,用于监测和收集数据进行分析。
在上一篇文章中,我们介绍了如何在代码执行期间实时检测DS18B20 温度传感器中的故障。看图5的结果,通过以下链接访问:访问上一篇!
感谢PCBWay支持我们的 YouTube 频道并生产和组装质量更好的 PCB。
Silícios 实验室感谢UTSOURCE提供电子元件。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !