กลับไปหน้ารวมไฟล์
energy-transition-in-miniature-part-2-b0954b.md

ชื่อโปรเจกต์: การเปลี่ยนผ่านพลังงานในขนาดจิ๋ว, ส่วนที่ 2

สัปดาห์ที่แล้ว เราได้พูดถึงฮาร์ดแวร์ของ เดโม “Energy Transition in Miniature” ของเรา สัปดาห์นี้เราจะมาพูดถึง ซอฟต์แวร์ สำหรับท่านที่ติดตาม โปรเจกต์ก่อนหน้านี้ ของผม คงจะทราบดีว่าผมมักจะเน้นไปที่ด้านการสอนมากกว่าประสิทธิภาพของโค้ด อย่างไรก็ตาม ด้วย Arduino Mega สิ่งนี้มักจะไม่ใช่ปัญหาใหญ่ ด้วยเหตุนี้ ผมจึงมักจะใช้ C++ objects เพื่อแยกโค้ดออกเป็น functional modules ดังที่แสดงไว้ด้านล่างสำหรับโปรเจกต์นี้:

สถาปัตยกรรมแบบโมดูลาร์

โมดูลส่วนใหญ่จะมีฟังก์ชัน setup() และ loop() ซึ่งจะถูกนำไปใช้ใน setup() และ loop() ของโมดูลที่อยู่สูงขึ้นไปในลำดับชั้น ระดับสูงสุด (energy) แสดงให้เห็นแนวทางนี้:

...
#include "Wizard.h"
#include "Interrupts.h"
#include "Model.h"
...
static Interrupts interrupt;
static Wizard wizard;
static Model model;
...
void setup() {
Serial.begin(9600);
Serial.println(F("SETUP ENERGY TRANSITION DEMO"));
interrupt.setup();
model.setup();
wizard.setup();
...
}
void loop() {
wizard.loop();
if ( interrupt.getSecondsFlank()) {
interrupt.clear();
...
switch ( balance ) {
case 0:
wizard.update();
break;
case 1:
...
break;
default:
break;
}
}
}

อาจเป็นที่ชัดเจนว่าสถาปัตยกรรมนี้เป็นไปตามรูปแบบ Model-View-Controller (MVC) pattern โดยมี wizard ที่ใช้โดย 2.8” LCD Screen จาก Adafruit ผมจะครอบคลุมส่วนนั้นในบล็อกถัดไป

ตอนนี้เราจะมุ่งเน้นไปที่โมเดล; interrupts ส่วนใหญ่จะใช้เพื่อสร้างตัวจับเวลาที่เสถียร 0.1 วินาที (และวินาทีและนาที) ซึ่งใช้เพื่อให้เอาต์พุตคล้าย PWM ที่เสถียรไปยัง motors เนื่องจาก motors เหล่านี้เชื่อมต่อกับ multiplexer ไม่ได้เชื่อมต่อโดยตรงกับ outputs ของ Arduino

 //Activate interrupt Timer2 (0.1 sec)
ISR(TIMER2_COMPA_vect) {
loopCounter++;
motors.handleInterrupt(200);
lights.handleInterrupt();
interrupt.flank = true;
if ( interrupt.getLock() )
return;
int_counter++;
int_counter %= SECONDS;
if ( int_counter == 0 )
interrupt.sec_flank = true;
else
return;
interrupt.min_flank = false;
interrupt.tensec_flank = false;
min_counter++;
interrupt.checkInitialisation();
min_counter %= MINUTES;
if ( min_counter == 0)
interrupt.min_flank = true;
if (( min_counter % TEN_SEC ) == 0)
interrupt.tensec_flank = true;
}

กล่าวโดยคร่าว โมเดลประกอบด้วยโมดูลสามประเภท:

  • Environment ซึ่งรวมถึงตัวจำลองสำหรับเวลา (Calendar) และสภาพอากาศ
  • In- and output ซึ่งอ่านค่าจาก solar panels และควบคุม LEDs และ motors
  • Park Layout ซึ่งคำนวณ In- และ output ใหม่ให้เป็นตัวเลขที่สมเหตุสมผลสำหรับ solar park จริง \t

โมดูลส่วนใหญ่ค่อนข้างตรงไปตรงมา ผมจึงจะไม่เจาะลึกเข้าไปในโค้ดมากนัก สิ่งเดียวที่อาจต้องให้ความสนใจคือ 16 channel analog/digital multiplexers สองตัวจาก SparkFun ตัวหนึ่งสำหรับ inputs (solar panels) และอีกตัวสำหรับ outputs (LEDs และ motors) multiplexer ทำงานได้ดีสำหรับ inputs ดังนั้นโค้ดสำหรับ solar panels จึงค่อนข้างตรงไปตรงมา:

 Solar::Solar() {}
void Solar::setup( int smpl) {
pinMode(A15, INPUT);
for ( int i = 0; i < 3; i++) {
pinMode(SS0 + i, OUTPUT);
digitalWrite(SS0 + i, LOW);
}
samples = smpl;
counter = 0;
}
uint16_t Solar::read(byte number) {
switch ( number ) {
case 0:
digitalWrite(SS0, LOW);
digitalWrite(SS1, LOW);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 1:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, LOW);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 2:
digitalWrite(SS0, LOW);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 3:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, LOW);
digitalWrite(SS3, LOW);
break;
case 4:
digitalWrite(SS0, LOW);
digitalWrite(SS1, LOW);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 5:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, LOW);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 6:
digitalWrite(SS0, LOW);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 7:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, LOW);
break;
case 8:
digitalWrite(SS0, LOW);
digitalWrite(SS1, LOW);
digitalWrite(SS2, LOW);
digitalWrite(SS3, HIGH);
break;
case 15:
digitalWrite(SS0, HIGH);
digitalWrite(SS1, HIGH);
digitalWrite(SS2, HIGH);
digitalWrite(SS3, HIGH);
break;
default:
digitalWrite(A15, LOW);
digitalWrite(SS0, LOW)

ข้อมูล Frontmatter ดั้งเดิม

title: "Energy Transition in Miniature, part 2"
description: "For the new curriculum that focuses on the energy transition at Dirksen University of Applied Science, we developed a demo"
author: "keesp"
category: "Lab Stuff"
tags:
  - "energy transition"
  - "solar panels"
views: 2919
likes: 1
price: 2450
difficulty: "Intermediate"
components:
  - "1x Arduino Mega 2560"
  - "1x SparkFun Analog/Digital MUX Breakout - CD74HC4067"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles:
  - "https://github.com/condast/EnergyDemo"
documentationLinks: []
passwordHash: "468fa0ad5dbbe74216427931603c9b00557dfd043aa34b216109958fe762b3bc"
encryptedPayload: "U2FsdGVkX189q9ZpemjTvVykjHEjEH+HC2rUE/W5QRUAcuehkmAnhUnyO+173JQ9vR3Z5tIHRuEf5osKY0+VI0LeBHL1/QmrAccuRm0/5Mc="
seoDescription: "Energy Transition in Miniature demo for Dirksen University of Applied Science. An Arduino-based educational project."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/energy-transition-in-miniature-part-2-b0954b_cover.jpg"
lang: "th"