1 有用
0 下载

ATTO应用:减少能耗

文件列表(压缩包大小 2.25K)

免费

概述

需要的元件

  • Arduino UNO

  • ATTO:世界上最小的Arduino

  • 诺基亚5110屏幕

  • SparkFun按钮开关12mm

  • 杜邦线

  • 面包板

  • LED 5mm

  • 电阻1kohm、330ohm

  • Arduino IDE

原理及流程

介绍

在许多系统中,我们使用电池供电或直接连接到电力,我们必须考虑的主要因素之一是减少能耗。

越来越多的人开始关注减少消耗,为此。我们开发了一个系统来帮助降低功耗并使用Arduino关闭微控制器系统的各个部分。

该系统可用于降低功耗并在一定时间内不使用系统时使大多数设备保持关闭状态。

在这个项目中,你将使用Atto:世界上最小的Arduino来完成这个项目。

如果你需要了解ATTO板,可以访问本站的另一篇文章。

演示视频

开发项目

通过需要减少能耗,我们需要创建具有良好能源效率的设备。因此,该项目旨在在设备使用时间不超过10秒时关闭系统上的某些负载。

以下是图1中的代码。诺基亚5110 LCD用于显示传感器检测到的对象计数值。传感器由按钮表示。

20190724_144726_VCaLV68BXc

图1-对象计数的演示屏幕。

在此电路中,我们使用红色LED指示要关闭的负载。

当系统超过10秒未检测到新物体时,此LED指示灯将始终熄灭。

为了让你理解该项目的所有逻辑,我们将通过下面介绍的代码进行教学。

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
  
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 9, 6, 12, 4);
  
// pin 3 - Serial clock out (SCLK)
// pin 9 - Serial data out (DIN)
// pin 6 - Data/Command select (D/C)
// pin 12 - LCD chip select (CS/CE)
// pin 4 - LCD reset (RST)
  
bool state = 0, previous_state = 0, TurnOffDevice = 0;
byte quantity = 0, count = 0;
long int actual_time = 0, last_time = 0;
  
void TurnOffDevices();
void TurnOnDevices();
  
void setup()   
{ 
 display.begin();
 display.setContrast(50);
  
 pinMode(5, OUTPUT);
 pinMode(14, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, INPUT);
 pinMode(13, OUTPUT);
  
 digitalWrite(5, HIGH);
 digitalWrite(14, HIGH);
 digitalWrite(10, HIGH);
 digitalWrite(13, HIGH);
  
 display.clearDisplay();
  
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor(0,0);
 display.println("   Quantity");
 display.setTextSize(2);
  
 display.setCursor(35,10);
 display.println(count);
 display.display();
}
  
void loop()
{
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(BLACK);
      display.setCursor(0,0);
      display.println("   Quantity");
      actual_time = millis();
  
   bool sensor = digitalRead(11);
   delay(50);
  
   if(previous_state == 0 && sensor == 1)
   {
      TurnOnDevices();
      display.setTextSize(2); 
      display.setCursor(35,10);
      count++;        
      display.println(count);  
      previous_state = 1;
      display.display();
      last_time = actual_time;
   }
  
   if((previous_state == 1 && sensor == 0))
   {
      previous_state = 0;
      last_time = actual_time;
   }
  
   if((actual_time - last_time) > 10000 && previous_state == 0 && sensor == 0)
   {
      TurnOffDevices();
      last_time = actual_time;
      display.clearDisplay();
      display.display();
   }
}
  
void TurnOnDevices()
{
 digitalWrite(14, HIGH);
}
  
void TurnOffDevices()
{
 digitalWrite(14, LOW);
}

最初,声明了诺基亚5110显示库,定义了ATTO板与人机界面之间的变量和连接引脚。

最后,声明了打开和关闭设备的功能原型,如下所示。

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
  
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 9, 6, 12, 4);
  
// pin 3 - Serial clock out (SCLK)
// pin 9 - Serial data out (DIN)
// pin 6 - Data/Command select (D/C)
// pin 12 - LCD chip select (CS/CE)
// pin 4 - LCD reset (RST)
  
bool state = 0, previous_state = 0, TurnOffDevice = 0;
byte quantity = 0, count = 0;
long int actual_time = 0, last_time = 0;
  
void TurnOffDevices();
void TurnOnDevices();

在void setup函数中,我们初始化显示并将其对比度设置为50%。然后,将引脚5、10和13设置为关闭ATTO板的RGB LED。

最后,我们将按钮引脚(引脚11)设置为输入,将负载引脚(LED)设置为输出。

void setup()   
{ 
 display.begin();
 display.setContrast(50);
  
 pinMode(5, OUTPUT);
 pinMode(14, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, INPUT);
 pinMode(13, OUTPUT);
  
 digitalWrite(5, HIGH);
 digitalWrite(14, HIGH);
 digitalWrite(10, HIGH);
 digitalWrite(13, HIGH);
  
 display.clearDisplay();
  
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor(0,0);
 display.println("   Quantity");
 display.setTextSize(2);
  
 display.setCursor(35,10);
 display.println(count);
 display.display();
}

在空循环功能中,我们清除了显示屏,并在下面显示了消息数量和对象计数值,如图2所示。

20190724_150541_Nj2Fxw1bkt

图2-初始屏幕显示消息和计数值。

然后,我们开始时间监视过程,以找出设备是否应该关闭某些负载。为此,我们使用了millis函数。

void loop()
{
      display.clearDisplay();
      display.setTextSize(1);
      display.setTextColor(BLACK);
      display.setCursor(0,0);
      display.println("   Quantity");
      actual_time = millis();
  
   bool sensor = digitalRead(11);
   delay(50);

请注意,actual_time = millis()命令;将返回当前的运行时值。

此后,读取数字引脚11并将其存储在传感器变量中。

利用传感器变量的值,系统将检查条件以确定要执行的操作。

在第一种情况下,系统检查传感器变量的先前值是否为0且其当前值为1。

if(previous_state == 0 && sensor == 1)
   {
      TurnOnDevices();
      display.setTextSize(2); 
      display.setCursor(35,10);
      count++;        
      display.println(count);  
      previous_state = 1;
      display.display();
      last_time = actual_time;
   }

如果为true,则系统执行TurnOnDevice功能来激活设备,增加计数值并在用户屏幕上显示其值。

不久之后,它将1赋给previous_state变量,以表示先前的传感器状态等于1。

最后,它将current_time值分配给last_time以指示最后一个时间值。

下一个条件将检查传感器的先前状态是否为1以及当前传感器值为0。

如果此条件为true,则previous_state变量的值为0。这表示传感器的先前状态已设置为0,并且如果为true,则系统可能会再次进入程序的第一个条件。

最后,我们将current_time值分配给last_time以更新最后一个时间值。

现在,我们有了程序的第三个条件和最后一个条件。当传感器10秒钟或更长时间未检测到物体时,它将负责执行负载停用过程。

if((actual_time - last_time) > 10000 && previous_state == 0 && sensor == 0)
   {
      TurnOffDevices();
      last_time = actual_time;
      display.clearDisplay();
      display.display();
   }

请注意,该条件仅在满足以下条件时才为真。

  • 传感器不得检测任何物体。因此,其值为0。
  • previous_state变量的值必须为0,以指示以前传感器处于关闭状态。
  • 当前Millis函数读取时间与系统运行时先前存储的时间之间的时间差必须为10000 ms。

该值等于10秒。因此,假设此条件为真,系统将执行TurnOffDevices功能以关闭LED或其他设备,如图3所示。此后,将更新last_time变量的值并清除诺基亚显示屏。

20190724_144726_HA3ACfUxYR

图3-LED和消息已停用。

然后重复该循环,直到用户再次按下按钮,然后系统打开负载并按照程序的第一个条件中所述增加计数。

现在,了解实现此项目以及打开或关闭其他负载的简单性。你可以更改TurnOnDevices和TurnOffDevices功能,并插入其他引脚以激活和停用其他负载。

void TurnOnDevices()
{
 digitalWrite(14, HIGH);
}
  
void TurnOffDevices()
{
 digitalWrite(14, LOW);
}

这两个函数在代码末尾声明。

结论

当我们想在项目中使用时间作为参数时,便可以运用到这些技术。在此项目中,我们仅使用一个传感器/按钮,但是你可以将此逻辑扩展到系统中的更多按钮或者传感器,当一个或多个按钮/传感器没有被操纵或检测到任何东西时,系统将关闭某些负载以节省能源。

最后

所有需要的文件在下载区均可找到。

via:https://www.hackster.io/170206/world-s-smallest-arduino-applied-in-a-system-to-save-energy-f36fc9

理工酷提示:

如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈

评论(0)

0/250