Dozator automat pentru hrănit peștii (3) Upgrade - Programarea controller-ului Arduino Nano Every în PlatformIO și adăugarea unui buton

Programarea controller-ului Arduino Nano Every în PlatformIO și adăugarea unui buton

Azi i-am făcut un upgrade proiectului "Dozator automat pentru hrănit peștii" realizat în 2020 pentru a automatiza hrănirea peștilor din acvariul personal. Dozatorul în mod normal se activa la orele 7:30 și 20:30, dar nu aveam posibilitatea să-l activez manual, astfel i-am adăugat un buton pentru activare. Se vede în imaginea de mai jos montarea butonului pe capac deasupra controller-ului. Astfel prin apăsarea butonului dozatorul o să elibereze o doză de hrană spre fericirea peștișorilor.

Dozator automat pentru hrănit peștii (3) Upgrade - Programarea controller-ului Arduino Nano Every în PlatformIO și adăugarea unui buton

Pentru a face proiectul mai interesant am realizat configurația pentru platformIO bazat pe Visual Studio Code, în principiu pentru că este un IDE mult mai ușor de folosit, și îmi oferă o navigare mult mai facilă în codul sursă la variabile și funcții. PlatformIO oferă și o căutare foarte faină cu vizualizarea directă a fișierelor unde se află cuvântul cheie căutat.

Componente:

Din păcate nu am mai găsit pe piață componentele folosite de mine, dar am găsit componentele compatibile cu proiectul meu.

Schema electronica/sistem:

 Pentru a conecta butonul am ales calea "quick and dirty", adică am lipit firele direct pe pini. 
Am lipit GND la GND-ul buttonașului, 5 V la VCC și starea butonului la Pinul D13, pentru că acest pin este și digital , dar este și conectat la LED-ul de pe placă, astfel o să se aprindă și LED-ul când este apăsat butonul.


 

Apoi am înghesuit toate componentele în cutiuță, iar butonul l-am montat pe capac pentru al feri de eventuale stropiri cu apa din acvariu.

 

 Montarea pe acvariu este aceeași, și accesul la butonaș este facilă.

 

 Am făcut și un scurt filmuleț pentru a arăta activarea dozatorului cu butonul adăugat.

Configurarea platformIO

1. Crearea unui nou proiect in PlatformIO -> New Project

2. Selectarea plăcii folosite, în cazul nostru este Arduino Nano Every, iar apoi se apasă Finish pentru crearea proiectului magic.

3. Configurarea librăriilor nu este necesară dacă se adaugă conținutul fișierului ini de mai jos în platformio.ini aferent proiectului

 

; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:nano_every]
platform = atmelmegaavr
board = nano_every
board_build.mcu = atmega4809
board_build.f_cpu = 16000000L
framework = arduino
monitor_speed = 115200
lib_deps =
arduino-libraries/Servo@^1.1.8
adafruit/RTClib@^2.0.2
adafruit/Adafruit BusIO@^1.11.6

4. Apoi urmează să adăugați codul sursă de mai jos, pe care l-am compilat și funționează.

5. Programarea efectivă se realizează apăsând butonașul încercuit cu chenar roșu din screenshotul de mai jos

Codul sursă

/*
Florin Simedru
Complete project details at https://automatic-house.blogspot.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
// Date and time functions using a PCF8523 RTC connected via I2C and Wire lib
#include <Arduino.h>
#include <SPI.h>
#include "RTClib.h"
#include "Servo.h"
#include "stdint.h"
#include "time.h"
#include "stdio.h"
#define PIN_D13 13
#define PIN_SERVO 3
void Servo_click();
void Servo_parking();
RTC_PCF8523 rtc;
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
int pos_read = 0; // variable to store the servo position
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int alarm = 0;
void setup () {
// initialize digital pin LED_BUILTIN as an output.
pinMode(PIN_D13, INPUT);
while (!Serial) {
delay(1); // for Leonardo/Micro/Zero
}
Serial.begin(115200);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (! rtc.initialized()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call: rtc.adjust(DateTime(2020, 4, 17, 10, 38, 0));
}
myservo.attach(PIN_SERVO); //the pin for the servoa control
if(myservo.attached() == 1)
{
Serial.println("Servo motor was attched .");
Servo_parking();
}
}
void loop () {
DateTime now = rtc.now();
DateTime future = rtc.now();
int buttonState = digitalRead(PIN_D13);
Serial.print("Button state :");
Serial.println(buttonState);
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" now + 7d + 12h + 30m + 6s: ");
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
if((((now.hour()== 7) || (now.hour()== 20)) && (now.minute()==30)&& ((now.second()== 10)||(now.second()== 20))) || ( buttonState == 1))
{
alarm = 1;
if(myservo.attached() == 0)
{
myservo.attach(PIN_SERVO);
}
}
else
{
alarm = 0;
if( myservo.attached() == 1)
{
myservo.detach();
Serial.println("Servo motor was detached .");
}
}
if(alarm == 1)
{
Servo_click();
pos_read= myservo.read();
Serial.println(pos_read);
}
Serial.print(" Alarma: ");
Serial.print(alarm, DEC);
Serial.println();
delay(1000);
}
void Servo_click()
{
for (pos = 0; pos <= 90; pos += 1)
{ // goes from 0 degrees to 90 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 15ms for the servo to reach the position
}
pos_read= myservo.read();
Serial.println(pos_read);
for (pos = 90; pos >= 0; pos -= 1)
{ // goes from 90 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 15ms for the servo to reach the position
}
}
void Servo_parking()
{
pos_read= myservo.read();
Serial.println(pos_read);
for (pos = 90; pos >= 0; pos -= 1)
{ // goes from 90 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(10); // waits 15ms for the servo to reach the position
}
}

 

Documentatie proiect

Afiliere eMag:

 Linkurile de la secțiunea "Componente" conțin adresa mea de afiliere la eMag.ro, iar dacă cumperi folosind aceste linkuri vei susține blogul meu. Mulțumesc! 

eMag Genius:
Hai și tu în Genius! Abonează-te la Genius 12 luni și primești beneficii premium și 20 lei card cadou eMAG. Profită acum! eMag Genius

Mulțumesc pentru atenție!

Pentru întrebari și/sau consultanță tehnică vă stau la dispozitie pe blog mai jos în secțiunea de comentarii sau pe email simedruflorin@automatic-house.ro. O zi și seară plăcută tuturor ! 

 Back to top of page





Etichete

Afișați mai multe

Arhiva

Afișați mai multe