13-04-2020, 19:04
Witam,
postanowiłem zrobić generator koloidalny,
Generalnie prąd podawany jest na srebrne elektrony i woda się elektrolizuje.
Ale nie oto chodzi.
Napisałem program z menu w którym wybiera się napięcie zasilania i czas zmiany polaryzacji.
Kiedy wgrałem do na płytkę nano, to okazało się że cokolwiek bym nie wybrał (napięcie z menu) to zmiana zachodzi wyłącznie na pinie 11, czyli zmienia się stan na niski sterując przekaźnikiem. Proszę o poradę co źle zrobiłem.
wklejam poniżej kod:
postanowiłem zrobić generator koloidalny,
Generalnie prąd podawany jest na srebrne elektrony i woda się elektrolizuje.
Ale nie oto chodzi.
Napisałem program z menu w którym wybiera się napięcie zasilania i czas zmiany polaryzacji.
Kiedy wgrałem do na płytkę nano, to okazało się że cokolwiek bym nie wybrał (napięcie z menu) to zmiana zachodzi wyłącznie na pinie 11, czyli zmienia się stan na niski sterując przekaźnikiem. Proszę o poradę co źle zrobiłem.
wklejam poniżej kod:
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define UP 2 // przycisk UP na Pin3
#define DOWN 1 // przycisk DOWN na pinie 2
#define OK 3 // przycisk OK na pinie 4
long ilosc_zmian = 0;
#define przekaznik32V 8
#define przekaznik24V 9
#define przekaznik18V 10
#define przekaznik12V 11
#define zmiana1 5
#define zmiana2 6
#define stan_OFF 20
#define stan_czekaj1 21
#define stan_ON 22
#define stan_czekaj2 23
byte state = stan_OFF;
unsigned long czas = 0;
unsigned long stoper = 0;
unsigned long stoper1 = 0;
unsigned long start = 0;
unsigned long czas_od_zmiany = 0;
unsigned long czas_od_zmiany1 = 0;
// --- zmienne: ------------------------------------------------
String s[12] = { // tablica wszystkich opcji (tutaj przesadziłem z tym 50, bo jest ich 31)
"Tryb Automat.", "Tryb reczny", "Pomiar TDS", // poziom 0 MENU GŁÓWNE
"<<<- powrot", "Start", "Ustaw czas zmiany", "Start TDS", // poziom 1 Submenu dla PLIK
"<<<-koniec", "Napiecie 32V", "Napiecie 24V", "Napiecie 18V", "Napiecie 12V", // poziom 2 Submenu dla EDYCJA
};
// poziom 5 Submenu dla POMOC
int Min[3] = {0, 3, 7}; // tablica położeń dla pierwszej opcji dla danego poziomu
int Max[3] = {2, 6, 11};
volatile int napiecie;
volatile int ak; // numer aktualnej opcji
volatile int poziom; // numer aktualnego poziomu menu
int min, max; // min i max dla danego poziomu, czyli pierwsza i ostatnia opcja
int pop = -1; // zmienna pomocnicza do sprawdzenia czy nastąpiła zmiana w MENU
bool ekran = true; ///bool isInLowerLevel = false;
unsigned long czas_zmiany = 1;
volatile int t0 = czas_zmiany * 60;
// ---- funkcja co wybrano ----------------------------------------
int co() //funkcja zwraca wartość równą indeksowi tablicy s (lub -1)
{
max = Max[poziom]; // określamy granicę przesuwania menu dla klawisza UP
min = Min[poziom]; // określamy granicę przesuwania menu dla klawisza UP
if (digitalRead(DOWN) == LOW) {
delay(100); // jeśli DOWN
if (digitalRead(DOWN) == LOW) {
ak--;
if (ak < min) {
ak = min;
}
}
}
if (digitalRead(UP) == LOW) {
delay(100); // jeśli UP
if (digitalRead(UP) == LOW) {
ak++;
if (ak > max)
{
ak = max;
}
}
}
if (digitalRead(OK) == LOW) {
delay(100);
if (digitalRead(OK) == LOW) // jeśli OK
{
if (poziom == 0 && ak == Min[0]) {
poziom = 1;
ak = Min[1] + 1;
return -1; // przejśćie z pozycji tryb auto do start
}
///-----------------------------------------------------------------
if (poziom == 0 && ak == 1) {
// while (digitalRead(OK) == LOW
lcd.home();
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
do
{
lcd.setCursor(0, 0);
lcd.print("USTAW CZAS");
lcd.setCursor(0, 1);
lcd.print("ZMIANY:");
if (digitalRead(DOWN) == LOW) {
delay(100); // jeśli DOWN
if (digitalRead(DOWN) == LOW) {
czas_zmiany--;
t0 = czas_zmiany * 60;
if (czas_zmiany < 1) {
czas_zmiany = 1;
t0 = czas_zmiany * 60;
}
}
}
if (digitalRead(UP) == LOW) {
delay(100); // jeśli DOWN
if (digitalRead(UP) == LOW) {
czas_zmiany++;
t0 = czas_zmiany * 60;
if (czas_zmiany >= 1001) {
czas_zmiany = 1000;
t0 = czas_zmiany * 60;
}
}
}
lcd.setCursor(9, 1);
lcd.print(czas_zmiany);
delay(200);
}
while (digitalRead(OK) == !LOW);
poziom = 2;
ak = 8;
return -1; // przejśćie z pozycji tryb reczny do ustaw czas
}
////////////////////////////////////////////////////////////
if (poziom == 2 && ak == 8)
{
napiecie = 32;
return ak;
}
if (poziom == 2 && ak == 9)
{
napiecie = 24;
return ak;
}
if (poziom == 2 && ak == 10)
{
napiecie = 18;
return ak;
}
if (poziom == 2 && ak == 11)
{
napiecie = 12;
return ak;
}
//////////////////////////////////////////////////////////////////
if (poziom == 0 && ak == 2) {
poziom = 1;
ak = 6;
return -1; // przejśćie z pozycji pomiar TDS do Start TDS
}
///////////////////////////////////////////////////////////
// // takie tam sztuczki :-)
// if (poziom > 0 && ak > Min[poziom]) {
// return ak; ///// przycisk przy wartości start
// }
////////////////////////////////////////////////////////////////////////////////
if (ak == 4)
{
return ak;
}
////////////////////////////////////////////////////////////////////////////
if (poziom > 0 && ak == Min[poziom]) {
ak = poziom - 1;
poziom = 0;
digitalWrite(przekaznik32V, HIGH);
digitalWrite(przekaznik24V, HIGH);
digitalWrite(przekaznik18V, HIGH);
digitalWrite(przekaznik12V, HIGH);
return -1;
}
}
// jak nic nie naciśnięto to jednak coś trza zwrócić :-)
}
return -1;
}
void wybor_pradu()
{
if (napiecie = 32)
{
digitalWrite(przekaznik32V, LOW);
digitalWrite(przekaznik24V, HIGH);
digitalWrite(przekaznik18V, HIGH);
digitalWrite(przekaznik12V, HIGH);
}
if (napiecie = 24)
{
digitalWrite(przekaznik32V, HIGH);
digitalWrite(przekaznik24V, LOW);
digitalWrite(przekaznik18V, HIGH);
digitalWrite(przekaznik12V, HIGH);
}
if (napiecie = 18)
{
digitalWrite(przekaznik32V, HIGH);
digitalWrite(przekaznik24V, HIGH);
digitalWrite(przekaznik18V, LOW);
digitalWrite(przekaznik12V, HIGH);
}
if (napiecie = 12)
{
digitalWrite(przekaznik32V, HIGH);
digitalWrite(przekaznik24V, HIGH);
digitalWrite(przekaznik18V, HIGH);
digitalWrite(przekaznik12V, LOW);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void przel() { ///// do zrobienia \/\/\/\/\/\/\/\/\/\
while (ilosc_zmian<1000){
switch (state) {
case stan_OFF:
digitalWrite(zmiana1, LOW);
digitalWrite(zmiana2, LOW);
state = stan_czekaj1;
ilosc_zmian++;
czas_od_zmiany = millis();
lcd.clear();
break;
case stan_czekaj1:
if ((millis() - czas)/1000 >= t0)
{
state = stan_ON;
czas = millis();
}
stoper = (millis() - start) / 1000 / 60 ;
lcd.setCursor(0, 0);
lcd.print("Czas:");
lcd.print(stoper);
lcd.setCursor(10, 0);
lcd.print("Iz=");
lcd.print(ilosc_zmian);
lcd.setCursor(0, 1);
lcd.print("T:");
stoper1 = (millis() - czas_od_zmiany) / 1000;
lcd.print(stoper1);
lcd.print("s");
lcd.setCursor(10, 1);
lcd.print("Tz= ");
lcd.print(czas_zmiany);
break;
case stan_ON:
digitalWrite(zmiana1, HIGH);
digitalWrite(zmiana2, HIGH);
state = stan_czekaj2;
ilosc_zmian++;
czas_od_zmiany1 = millis();
lcd.clear();
break;
case stan_czekaj2:
if ((millis() - czas)/1000 >= t0 )
{
state = stan_OFF;
czas = millis();
}
stoper = (millis() - start) / 1000 / 60 ;
lcd.setCursor(0, 0);
lcd.print("Czas:");
lcd.print(stoper);
lcd.setCursor(10, 0);
lcd.print("Iz=");
lcd.print(ilosc_zmian);
lcd.setCursor(0, 1);
lcd.print("T:");
stoper1 = (millis() - czas_od_zmiany1) / 1000;
lcd.print(stoper1);
lcd.print("s");
lcd.setCursor(10, 1);
lcd.print("Tz= ");
lcd.print(czas_zmiany);
break;
}
}
}
///////////// do zrobienia /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\
// === neverending story ===============================================
// --- funkcja do prezentacji MENU na Serialu --------------------------
void pokazSerial()
{
lcd.home();
lcd.clear();
lcd.setCursor(2, 1);
lcd.print(s[ak]);
lcd.print(ak);
// nowa linia
}
// ---------------------------------------------------------------------
void setup()
{
Serial.begin(9600); // inicjalizacja Seriala
pinMode(DOWN, INPUT_PULLUP); // konfiguracja pinów dla przycisków
pinMode(UP, INPUT_PULLUP); // konfiguracja pinów dla przycisków
pinMode(OK, INPUT_PULLUP); // konfiguracja pinów dla przycisków
ak = 0; poziom = 0; // parametry początkowe MENU
max = Max[poziom]; // index dla ost. pozycji menu
min = Min[poziom]; // index dla pierwszej pozycji menu
pinMode(przekaznik32V, OUTPUT); // konfiguracja pinów dla przycisków
pinMode(przekaznik24V, OUTPUT);
pinMode(przekaznik18V, OUTPUT);
pinMode(przekaznik12V, OUTPUT);
pinMode(zmiana1, OUTPUT);
pinMode(zmiana2, OUTPUT);
digitalWrite(przekaznik32V, HIGH);
digitalWrite(przekaznik24V, HIGH);
digitalWrite(przekaznik18V, HIGH);
digitalWrite(przekaznik12V, HIGH);
digitalWrite(zmiana1, HIGH);
digitalWrite(zmiana2, HIGH);
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
lcd.home();
lcd.setCursor(3, 0);
lcd.print("GENERATOR");
lcd.setCursor(3, 1);
lcd.print("WITAM");
czas = millis();
start = millis();
// lcd.setCursor(3, 0);
// lcd.print("GENERATOR");
delay(2500);
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print("MENU WYBORU");
if (pop != ak) {
// lcd.begin(16, 2);
lcd.home();
pokazSerial(); // aby nie śmiecić na serialu, wyświetlam tylko zmiany :-)
pop = ak;
}
delay(120);
switch (co())
{
case 8:
{
wybor_pradu();
przel();
}
break;
case 9:
{
wybor_pradu();
przel();
}
break;
case 10:
{
wybor_pradu();
przel();
}
break;
case 11:
{
wybor_pradu();
przel();
}
break;
}
}