这个东西就是实现在一定时间内按照间隔运行,淘宝上有很多,实际上如果不是为了测试我并没有必要自己做一个。
主要这个是我试着使用Mixly——一种图形化编程软件,支持Arduino IDE。这是我使用这个工具完成的一个简单项目,总的耗时为2.5小时
但是随着使用,我不得不怀疑这个软件真的是给小朋友用的吗,图形化后,逻辑上面的易用性确实提升了,很多语句不用查询不用百度搜索。
但是细节上的修改反而有比较多的繁琐的问题,比如说要配置一个value+1000,你不能直接写value+1000必须要拖拽一个模块下来
最终 整个项目的图形化界面有这么大
生成的代码有个优点是你不用去关心漏掉什么符号一类,只要在意一下这个东西的逻辑到底有没有搞清楚。
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
volatile int times;
volatile int interval;
volatile unsigned long temp;
volatile unsigned long temp2;
volatile int run;
volatile int min2;
volatile int seconds;
void page1() {
u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
u8g2.setFontPosTop();
u8g2.setCursor(3,4);
u8g2.print("运行时间");
u8g2.setCursor(3+5*12,4);
u8g2.print(times);
u8g2.setCursor(3+8*12,4);
u8g2.print("分钟");
u8g2.setCursor(3,20);
u8g2.print("运行间隔");
u8g2.setCursor(3+5*12,20);
u8g2.print(interval);
u8g2.setCursor(3+8*12,20);
u8g2.print("秒");
u8g2.setFont(u8g2_font_helvR24_tf);
u8g2.setFontPosTop();
u8g2.setCursor(3,20+12);
u8g2.print(min2);
u8g2.setCursor(3+12*3,20+12);
u8g2.print(":");
u8g2.setCursor(3+12*6,20+12);
u8g2.print(seconds);
}
void stoprun() {
//停止计时器运行
//
u8g2.firstPage();
do
{
u8g2.drawFrame(22,18,5*16,18);
u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
u8g2.setFontPosTop();
u8g2.setCursor(32,20);
u8g2.print("停止运行");
run = 0;
min2 = 0;
seconds = 0;
}while(u8g2.nextPage());
digitalWrite(33,HIGH);
delay(1000);
digitalWrite(33,LOW);
}
void beep1() {
digitalWrite(33,HIGH);
delay(10);
digitalWrite(33,LOW);
}
void beep2() {
digitalWrite(33,HIGH);
delay(100);
digitalWrite(33,LOW);
delay(100);
digitalWrite(33,HIGH);
delay(100);
digitalWrite(33,LOW);
}
void Active() {
u8g2.firstPage();
do
{
u8g2.drawFrame(22,16,6*16,22);
u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
u8g2.setFontPosTop();
u8g2.setCursor(32,20);
u8g2.print("执行器启动");
}while(u8g2.nextPage());
}
void Reset() {
u8g2.firstPage();
do
{
u8g2.drawFrame(22,16,5*16,22);
u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
u8g2.setFontPosTop();
u8g2.setCursor(32,20);
u8g2.print("恢复默认");
}while(u8g2.nextPage());
}
void Deactive() {
u8g2.firstPage();
do
{
u8g2.drawFrame(22,18,5*16,18);
u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
u8g2.setFontPosTop();
u8g2.setCursor(32,20);
u8g2.print("执行器停止");
}while(u8g2.nextPage());
}
void setup(){
u8g2.enableUTF8Print();
u8g2.setI2CAddress(0x3C*2);
u8g2.begin();
pinMode(32, OUTPUT);
pinMode(33, OUTPUT);
times = 1;
interval = 15;
temp = 0;
temp2 = 0;
run = 0;
min2 = 0;
seconds = 0;
pinMode(34, INPUT);
pinMode(35, INPUT);
}
void loop(){
u8g2.firstPage();
do
{
page1();
}while(u8g2.nextPage());
digitalWrite(32,LOW);
digitalWrite(33,LOW);
// 按键判断
if (!digitalRead(34)) {
interval = interval + 5;
beep1();
temp = millis();
do{
if (temp + 1000 < millis()) {
//如果已经运行那么停止
if (run == 1) {
stoprun();
while(true);
}
u8g2.firstPage();
do
{
digitalWrite(33,HIGH);
u8g2.drawFrame(22,14,5*16,23);
u8g2.setFont(u8g2_font_wqy16_t_gb2312a);
u8g2.setFontPosTop();
u8g2.setCursor(32,20);
u8g2.print("开始运行");
delay(200);
seconds = seconds - 5;
digitalWrite(33,LOW);
run = 1;
}while(u8g2.nextPage());
delay(1200);
}
}while((!digitalRead(34)));
}
if (!digitalRead(35)) {
beep1();
times = times + 1;
temp = millis();
do{
if (temp + 1000 < millis()) {
//复位设置
Reset();
beep2();
interval = 15;
times = 1;
}
}while((!digitalRead(35)));
}
if (run == 1) {
if (temp2 + 1000 < millis()) {
seconds = seconds + 1;
temp2 = millis();
}
if ((long) (seconds) % (long) (interval) == 0) {
//设置RELAY启动
Active();
digitalWrite(32,HIGH);
delay(2000);
seconds = seconds + 2;
temp2 = millis();
digitalWrite(32,LOW);
}
if (seconds > times * 60) {
run = 0;
stoprun();
}
}
digitalWrite(33,LOW);
}