chtěl bych si nechat zkontrolovat program.
Před třemi měsíci mě napadlo ovládat výkon krbových kamen. Servo bude hýbat kruhovým přívodem kamen přímo na dvířkách. Je to dost krkolomný, ale že je to důvod seznámit se s Arduinem.
Takže kromě Arduina tam mám servo, dvě led (Jedna rgb, která signalizuje teplotu. Chtěl jsem PWM, ale nevím proč mi to nefungovalo. Teď to mám rozdělený každou barvu pro 100C a čím více svítí a míň času nesvítí. druhá signalizuje podprogram 1-3.) Ještě jedno tlačítko, bzučák (upozorní na klesající teplotu) a světelný senzor, který bude koukat do kamen. Aby rgb při 100C svítila kontinuálně jsem skoro všechno předělal do millis. Nechal jsem delay na bzučáku a jedeno malí na konci loop. Nikde jsem se nedozvěděl, jestli se to nemůže zavařit, když by to jelo na 100%.
Díky za připomínky. V provozu jsem to ještě nezkoušel, takže hodnoty jsou jen asi.
Kód: Vybrat vše
/*pripojeni serva / žlutá je řídící, červená je plus a hnědá mínus*/
// knihovna - arduino IDE
#include <Servo.h>
// Termočlánek + driver MAX6675
//knihovna z adresy - https://navody.dratek.cz/docs/texty/0/13/max6675_termoclanek.zip
#include <max6675.h>
// nastavení propojovacích pinů
int pinSO = 3;
int pinCS = 4;
int pinSCK = 5;
// vytvoření instance termoclanek z knihovny MAX6675
MAX6675 termoclanek(pinSCK, pinCS, pinSO);
int led = 8; //pin s LED diodou
int ledrgb[] = {11, 10, 9}; //pin s LED diodou RGB
int buzz = 12; // bzucak
int tlacitko = 13;
Servo sv;
int h1; //hodnoty mereni teploty nastaví polohu serva
int val = 999; //stará hodnota h1
int teplo = 300; //pouze prozetimní hodnota
int zima = 300; //pouze prozetimní hodnota
//proměnné millis
unsigned long cas = 0;
unsigned long casTeplomer = 0;
unsigned long casTlacitka = 0;
unsigned long vypnutiSvetla = 0;
unsigned long aktualniCas = 0;
unsigned long drivYellow = 0;
unsigned long drivRGB = 0;
unsigned long casServa = 0;
//Světelný senzor
byte pot = A0;
int tlac = 0; //promenna tlacitka (ano/ne)
int cteni = 1; //hodnota počítání stlačení tlačítka
int i;
int teplota = 25; //teplota bez desetiného místa
int intervalCteni = 100; //informační led / 1-3. program ( v programu nastavení serva (klapky))
int yellow = 0;
//Blikání rgb podle teploty
int stav = LOW;
int x; //proměnná rgb
int interval; //časová proměnná pro RGB
int svetlo; //změna hodnoty interval
int tma; //změna hodnoty interval
void setup() {
pinMode(led, OUTPUT);
pinMode(ledrgb[0], OUTPUT);
pinMode(ledrgb[1], OUTPUT);
pinMode(ledrgb[2], OUTPUT);
pinMode(buzz, OUTPUT);
pinMode(tlacitko, INPUT);
sv.attach(6);
Serial.begin(9600);
}
void checkSvetla() {
//Nastavení barvy led podle teploty a změna intervalu (světlo, tma)
if ((unsigned long) aktualniCas - drivRGB >= interval) {
drivRGB = aktualniCas;
if ((teplota >= 0) && (teplota < 100)) {
x = 0;
svetlo = (teplota * 10);
tma = (1000 - (teplota * 10));
}
else if ((teplota >= 100) && (teplota < 200)) {
x = 2;
svetlo = ((teplota - 99) * 10);
tma = (1000 - (teplota - 99) * 10);
}
else if ((teplota >= 200) && (teplota < 300)) {
x = 1;
svetlo = ((teplota - 199) * 10);
tma = (1000 - (teplota - 199) * 10);
}
if (stav == LOW) {
stav = HIGH;
interval = svetlo;
digitalWrite(ledrgb[x], HIGH);
} else {
stav = LOW;
interval = tma;
for (i = 0; i < 3; i++) {
digitalWrite(ledrgb[i], LOW);
}
}
}
////informační led / 1-3. program (cteni=číslo programu)
if (cteni == 1) {
if ((unsigned long) aktualniCas - drivYellow >= intervalCteni) {
drivYellow = aktualniCas;
if ((intervalCteni == 1200) || (intervalCteni == 300)) {
//intervalCteni=jak dlouho svítí
digitalWrite(led, HIGH);
intervalCteni = 100;
}
else {
//intervalCteni=jak dlouho nesvítí
digitalWrite(led, LOW);
intervalCteni = 1200;
}
}
}
else if (cteni == 2) {
if ((unsigned long) aktualniCas - drivYellow >= intervalCteni) {
drivYellow = aktualniCas;
yellow++;
if ((intervalCteni == 300) || (intervalCteni == 1200)) {
digitalWrite(led, HIGH);
intervalCteni = 100;
}
else {
digitalWrite(led, LOW);
intervalCteni = 300;
}
if (yellow == 4) {
intervalCteni = 1200;
yellow = 0;
}
}
}
else if (cteni == 3) {
if ((unsigned long) aktualniCas - drivYellow >= intervalCteni) {
drivYellow = aktualniCas;
yellow++;
if ((intervalCteni == 300) || (intervalCteni == 1200)) {
digitalWrite(led, HIGH);
intervalCteni = 100;
}
else {
digitalWrite(led, LOW);
intervalCteni = 300;
}
if (yellow == 6) {
intervalCteni = 1200;
yellow = 0;
}
}
}
}
void loop() {
aktualniCas = millis();
//Vypnutí led. Čas běží od posledního tlačítka. IF se svítí. ELSE se led vypnou.
if (tlac == 1) {
vypnutiSvetla = aktualniCas;
}
if ((unsigned long) (aktualniCas - vypnutiSvetla) <= 300000) { //minuta je 60 000
checkSvetla();
}
else {
for (i = 0; i < 3; i++) {
digitalWrite(ledrgb[i], LOW);
}
digitalWrite(led, LOW);
}
//////////////////
//Měření teploty
if ((unsigned long) (aktualniCas - casTeplomer) >= 10000) { //minuta je 60 000
casTeplomer = aktualniCas;
// načtení aktuální teploty termočlánku
// do proměnné teplotaC
float teplotaC = termoclanek.readCelsius();
Serial.print("Teplota je: ");
Serial.println(teplotaC);
teplota = abs(teplotaC);
}
//Read tlačítka. Interval 1,2s.
if ((unsigned long) (aktualniCas - casTlacitka) >= 1200) { //minuta je 60 000
if (digitalRead(tlacitko) == HIGH) {
tlac = 1;
intervalCteni = 300;
yellow = 0;
casTlacitka = aktualniCas;
}
else {
tlac = 0;
}
}
else {
tlac = 0;
}
///////
///////Pokud jsou vzpnuty led, tak high. Pokud high, tak se zvýší číslo programu serva /switch/.
if (aktualniCas >= vypnutiSvetla + 300000) { //minuta je 60 000
cteni = cteni;
}
else {
cteni = cteni + tlac;
}
if (cteni == 4) {
cteni = 1;
}
switch (cteni) {
case 1:
//pokud je hodnota promenne 1, Roztápěcí režim
if ((unsigned long) (aktualniCas - casServa) >= 60000) { //minuta je 60 000
casServa = aktualniCas;
h1 = constrain(teplota, 0, 200);
h1 = map(h1, 0, 200, 0, 90);
//Pokud rozdíl poslední polohy větší než 5, změna se neprovede.
if ((unsigned int)(h1 - val) > 4) {
sv.write(h1);
val = h1;
}
Serial.print("-switch1,");
Serial.print(val);
Serial.print("/");
Serial.println(h1);
}
break; //po provedeni teto casti konstrukce switch konci
case 2:
//pokud je hodnota promenne 2, standard topení
if ((unsigned long) (aktualniCas - casServa) >= 60000) { //minuta je 60 000
casServa = aktualniCas;
h1 = constrain(teplota, 0, 160);
h1 = map(h1, 0, 160, 0, 90);
//Pokud rozdíl poslední polohy větší než 5, změna se neprovede.
if ((unsigned int)(h1 - val) > 4) {
sv.write(h1);
val = h1;
}
Serial.print("-switch2,");
Serial.print(val);
Serial.print("/");
Serial.println(h1);
}
break;
case 3:
//pokud je hodnota promenne 3, Noční program
if ((unsigned long) (aktualniCas - casServa) >= 60000) { //minuta je 60 000
casServa = aktualniCas;
// POKUD SVETLO NESVITI
if (analogRead(pot) <= 100) {
h1 = constrain(teplota, 0, 130);
h1 = map(h1, 0, 130, 0, 90);
//Pokud rozdíl poslední polohy větší než 5, změna se neprovede.
if ((unsigned int)(h1 - val) > 4) {
sv.write(h1);
val = h1;
}
}
// POKUD SVITI
else {
h1 = constrain(teplota, 0, 130);
h1 = map(h1, 0, 130, 20, 90);
if ((unsigned int)(h1 - val) > 4) {
sv.write(h1);
val = h1;
}
}
Serial.print("svetlo,");
Serial.print(analogRead(pot));
Serial.print("-switch3,");
Serial.print(val);
Serial.print("/");
Serial.println(h1);
}
break;
}
teplo = zima;
if ((unsigned long) (aktualniCas - cas) >= 300000) { //minuta je 60 000
cas = aktualniCas;
float teplotaC = termoclanek.readCelsius();
zima = teplotaC;
Serial.print("-bzucak-");
Serial.print(zima);
if ((teplo < 100) && (zima < teplo)) {
Serial.print("-PíííP-");
for (i = 0; i < 5; i++) {
digitalWrite(buzz, HIGH);
delay(200);
digitalWrite(buzz, LOW);
delay(300);
}
digitalWrite(buzz, HIGH);
delay (100);
digitalWrite(buzz, LOW);
delay (588);
digitalWrite(buzz, HIGH);
delay (100);
digitalWrite(buzz, LOW);
delay (588);
digitalWrite(buzz, HIGH);
delay (688);
digitalWrite(buzz, LOW);
delay (8);
}
}
delay (4);
}