Funpack2-4基于AVR64DD32的加热和温度采集系统
基于AVR64DD32的加热和温度采集系统,通过LCD显示当前屏幕温度和曲线,当温度达到设定值,led灯显示不同颜色
标签
Arduino
Funpack活动
AVR64DD32
Funpack2-4
ST7735S
NST112-DSTR
llzx
更新2023-04-28
456

1.简介

      项目要求:通过扩展板上加温电阻加热,将温度传感器感知的变化,显示在LCD屏幕上,并绘制温升曲线。每隔1分钟改变加热电阻的占空比,重复温度测量和绘制的过程。当温度超过50°C时LED转为红色,低于20°C时LED变为蓝色,20-50°C显示为绿色。

      AVR64DD32是一款基于AVR 8位微控制器架构的微控制器。它采用了RISC架构,具有高性能、低功耗和高可靠性等特点。该芯片集成了64KB的Flash存储器和8KB的SRAM存储器,可以支持多种通信接口,如UART、SPI和I2C等。AVR64DD32单片机可以使用ARDUINO平台编程,适合初学者入门学习。同时,Arduino还提供的丰富的库,使得开发者可以快速上手并进行开发。

      这款开发板板载调试器,如果后续需要使用官方IED开发,调试和烧录十分方便,虽然ARDUINO不支持调试,但是这款板子使用过程中,烧录方便,除了第一次需要点击菜单中编程器下载,后面直接点解下载按钮即可。

   这次项目主要用到的传感器和器件如下:

   液晶屏LCD128x128 ST7735

   温度传感器 NST112-DSTR

 

2.原理图

      IO分配如下图,按键电路中不同的按键按下,电压值不一样,这里可以采用实测的方法,直接测量电压值,根据范围判断按钮是哪一个按下。这里扩展板连接到核心板是PD6,通过ADC读取电压值判断按键。

      所有的引脚,包括I2C SPI等接口可以通过软件修改,可以不按照下图进行连线。

FnEhZrOxpx3XOo5CE3gvrkzafg0q

 

3.程序

3.1初始化程序

      上电后,分别初始化LCD,NST112-DSTR,IO口的输入和输出模式,以及软件串口初始化。这里通过串口打印数据到电脑上位机,可以更便捷的输出更多的信息,由于Arduino不能调试,因此通过串口打印信息十分重要,这里AVR64DD32的推荐例程是软件串口,硬件串口无输出,这是需要注意的一点。

      包含的头文件和引脚定义如下

#include <Adafruit_GFX.h>    //核心图形库
#include <Adafruit_ST7735.h> //为ST7735硬件专用库
#include <Adafruit_ST7789.h> //为ST7789硬件专用库
#include <SPI.h>
#include "Arduino.h"
#define LED_BUILTIN PIN_PF5
#include <SoftwareSerial.h>
#include <Wire.h>
  #define TFT_CS        PIN_PA2 // Hallowing显示控制引脚:芯片选择
  #define TFT_RST       PIN_PA3 //显示复位
  #define TFT_DC        PIN_PA4 //显示数据/命令选择
 #define USER_SDA PIN_PC2
 #define USER_SCL PIN_PC3
 #define TFT_MOSI PIN_PA5 //数据输出
 #define TFT_SCLK PIN_PA6 //时钟输出

      IO和LCD及温度传感器初始化程序如下

SoftwareSerial mySerial(PIN_PD5, PIN_PD4); // RX, TX
mySerial.begin(9600);
NST112_Init();
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,TFT_DC,TFT_MOSI,TFT_SCLK,TFT_RST);
  pinMode(PIN_PD6,INPUT);
  pinMode(PIN_PD1,OUTPUT);
  pinMode(PIN_PD2,OUTPUT);
  pinMode(PIN_PD3,OUTPUT);
  pinMode(PIN_PF3, OUTPUT);

3.2温度传感器函数   

      由于这里是参考往期的程序,这里就不放具体的程序。需要可以从网站中搜索。

3.3LCD显示函数

      这里使用Arduino的Adafruit_GFX库,这个库提供了通用语法和图形功能集。使得Arduino的UI编程变得更加简单,初始化之后,需要绘制坐标轴和温度曲线,程序如下:

void coordinate_system(int scal )
{
  tft.setTextSize(1);//myGLCD.setTextSize(1);  
  tft.setTextColor(ST77XX_BLUE);
  tft.setTextSize(1);
  tft.drawLine(OX, 0,OX, 128, ST77XX_BLACK);//myGLCD.drawLine(OX, 0, OX, 240, TFT_BLACK);//竖线
  tft.drawLine(OX, OY,128, OY, ST77XX_BLACK);//myGLCD.drawLine(25, OY, 320, OY, TFT_BLACK);//横线
  for (int i = 1; i < 6; i++) {
    tft.drawLine(OX + 20 * i, OY - 1,OX + 20 * i, OY - 4, ST77XX_BLACK);//myGLCD.drawLine(OX + 20 * i, OY - 1, OX + 20 * i, OY - 4, TFT_BLACK); //横坐标
    tft.setCursor(OX + 20 * i-5, OY + 1);
    tft.print(i*20);
  }
  for (int i = 0; i < 6; i++) {
  tft.setCursor(1, OY - i * 20 - 3);
  tft.print(i*20);
   tft.drawLine(OX + 1, OY - 20 * i, OX + 4, OY - 20 * i, ST77XX_BLACK);//  myGLCD.drawLine(OX + 1, OY - 20 * i, OX + 4, OY - 20 * i, TFT_BLACK); //横坐标
  }
  }

      使用drawline函数绘制温度曲线

tft.drawLine(OX+location,OY - temp[location-1],OX+location+1,OY - temp[location], ST77XX_BLACK);

   截屏后重新绘制屏幕函数

void draw_curve(int *tem)
{
     tft.fillScreen(ST77XX_WHITE);
     coordinate_system(10);
  for(int i=1;i<100;i++){
    if(tem[i-1]>=0&&tem[i]>=0){
  tft.drawLine(OX+i-1,OY - tem[i-1],OX+i,OY - tem[i], ST77XX_BLACK);
    }
  }
  }

3.5 PWM输出

      每隔1分钟,调整PWM输出占空比,调节对电阻的加热功率。

analogWrite(PIN_PF3,50*count2);

4.调试和功能演示

      按键部分通过简单的方法避免计算复杂的电压公式,可以使用直接测量的方法,通过IO口测量不同按键按下的电压值,通过串口打印到电脑。如下当不同按键按下,实际读取电压值在明显不同的区间。

FlHC9x_yHqRckxYTwF0flbq2TL4U

      最后将不同占空比的温升曲线汇总如下,随着功率增加,稳态后的温度呈现上升的趋势。

Fq6tLq5hD5FJoT9DIfwc4NKPXgJa

5.总结

       通过arduino编程,虽然编程简单,不需要开发驱动,但是不同的板子会遇到不同的问题,后续有机会需要更多了解库文件里面具体的代码是如何实现的。

附件下载
程序.zip
团队介绍
个人
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号