Arduino Polska Forum

Pełna wersja: Warunkowe zatrzymanie-problem z kodem
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam!
Mam problem z kodem który stworzyłem na potrzeby urządzenia. Mianowicie warunkiem zadziałania układu jest spełnienie warunku temperatury powyżej 23 st. w przypadku przekroczenia tej granicy nie można włączyc układu (zaznaczyłem na czerwono ten fragment). Niestety po złozeniu wszystkiego na płytce i przekroczeniu temp. nadal istnieje możliwość uruchomienia. Co robię żle? Pomóżcie plisss...



int odczytanaWartosc = 0;
int czas = 0;
#include <Wire.h>  // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie biblioteki I2C dla LCD 20x4
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  
OneWire oneWire(ONE_WIRE_BUS); // deklaracja lini komuninkacji Arduino z czujnikiem
DallasTemperature sensors(&oneWire); // deklaracja (wskazanie) po jakiej lini ma sie komunikować Arduino z czujnikiem


void setup() 
{
  lcd.begin(20,4);  // Inicjalizacja wyświetlacza LCD 20X4
  lcd.clear();
  lcd.backlight(); // Włączenie podswietlenia LCD
    pinMode(8, OUTPUT); // zasilenie układu wyzwalającego
    pinMode(7, INPUT_PULLUP); // włącznik pracy
  sensors.begin();
  lcd.setCursor(0,0);   
}
void loop(void)
{
  // kod działania czujnika temperatury
  sensors.requestTemperatures(); // informacja o pobraniu temp przez czujnik
  float x=sensors.getTempCByIndex(0); //  Serial.println(x); 
  lcd.setCursor(0,2);
    lcd.print("Temp.aktualna");
      lcd.setCursor(0,3);
      lcd.print("          ");
        lcd.setCursor(0,4);
    lcd.print(x); 
 
// kod działania układu
  lcd.setCursor(0,0); //ustawienie kursora na pozycji 0,0
  lcd.print("Czas impulsu:"); // wyswietlenie frazy "Długość impulsu" na wyswietlaczu
  lcd.setCursor(0,1);
  lcd.print("              ms");
  odczytanaWartosc = analogRead(A1); // odczyt z potencjometru
  lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,1 (pierwszy wiersz, pierwsza kolumna)
  czas = odczytanaWartosc * (100/1023.0) ;
  lcd.print(czas);
  delay(100);      //przerwa pomiędzy kolejnymi impulsami
if (digitalRead(7) == LOW) 
{
  digitalWrite(8, HIGH); //praca
  delay(czas);//czas trwania przerwy pomiedzy impulsami

  }
  else {
  digitalWrite(8, LOW); //Wyłączenie
  }
  if (x<=23); //zabezpieczenie-gdy temp.jest większa lub równa 23 brak możliwości uruchomienia
  {
    digitalWrite(8, LOW);
  }   
}
Powinno być tu

if (digitalRead(7) == LOW && x<=23 )
Może dla tego że jest x<=23, a powinno być x>=23.
A no fakt to mi nie rzuciło się w oczy, mimo tego zrobił dwa warunki jeden włącza drugi wyłącza i w pewnym sensie zrobiło się takie "PWM" machanie pinem a powinno być to wspólne...
Dziękuję za odpowiedzi Panowie, niestety nie działaSad
Nie wiem dlaczego drugi warunek if ( zabezpieczenie ) nie jest realizowany. Jak mogę zmodyfikować kod aby jednak osiągnąc taki efekt? 
Aktualnie 


int odczytanaWartosc = 0;
int czas = 0;
#include <Wire.h>  // standardowa biblioteka Arduino
#include <LiquidCrystal_I2C.h> // dolaczenie biblioteki I2C dla LCD 20x4
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27 XXXXXXXXXXXXXXXX (wpisać co to jest)
OneWire oneWire(ONE_WIRE_BUS); // deklaracja lini komuninkacji Arduino z czujnikiem
DallasTemperature sensors(&oneWire); // deklaracja (wskazanie) po jakiej lini ma sie komunikować Arduino z czujnikiem


void setup() 
{
  lcd.begin(20,4);  // Inicjalizacja wyświetlacza LCD 20X4
  lcd.clear();
  lcd.backlight(); // Włączenie podswietlenia LCD
    pinMode(8, OUTPUT); // zasilenie układu wyzwalającego
    pinMode(7, INPUT_PULLUP); // włącznik pracy
  sensors.begin();
  lcd.setCursor(0,0);   
}
void loop(void)
{
  // kod działania czujnika temperatury
  sensors.requestTemperatures(); // informacja o pobraniu temp przez czujnik
  float x=sensors.getTempCByIndex(0); //  Serial.println(x); 
  lcd.setCursor(0,2);
    lcd.print("Temp.transformatora");
      lcd.setCursor(0,3);
      lcd.print("          ");
        lcd.setCursor(0,4);
    lcd.print(x); 
 
// kod działania układu
  lcd.setCursor(0,0); //ustawienie kursora na pozycji 0,0
  lcd.print("Czas impulsu:"); // wyswietlenie frazy "Czas impulsu" na wyswietlaczu
  lcd.setCursor(0,1);
  lcd.print("    ms");
  odczytanaWartosc = analogRead(A1); // odczyt ustawienia potencjometru
  lcd.setCursor(0,1); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
  czas = odczytanaWartosc * (100/1023.0) ;
  lcd.print(czas);
  delay(1000);      //przerwa pomiędzy kolejnymi impulsami
if (digitalRead(7) == LOW) // warunek if - w tym przypadku gdy nie mamy wcisnietego przycisku nic sie nie dzieje
//lecz gdy nastąpi wcisnięcie przycisku nastepuje sekwencja impulsow wraz z zadeklarowanym przerwaniem aż do momentu powrotu do stanu niskiego na pinie 7
{
  digitalWrite(8, HIGH); //praca
  delay(czas);//czas trwania przerwy pomiedzy impulsami
  }
  else {
  digitalWrite(8, LOW); //Wyłączenie
  }
  if (digitalRead(7) == HIGH && x>=23 ); //zabezpieczenie-gdy temp.jest większa lub równa 23 wyłącz mozliwość zgrzewania
  {
    digitalWrite(8, LOW);
  } 
   
}
Po co włączasz w ogóle?
Kod:
if (digitalRead(7) == LOW) // warunek if - w tym przypadku gdy nie mamy wcisnietego przycisku nic sie nie dzieje
//lecz gdy nastąpi wcisnięcie przycisku nastepuje sekwencja impulsow wraz z zadeklarowanym przerwaniem aż do momentu powrotu do stanu niskiego na pinie 7
{
  digitalWrite(8, HIGH); //praca
tu w ogóle nie powinien wejść w ten warunek gdy temperatura jest większa:



Kod:
if (! digitalRead(7) and x<=23)  // warunek if -  jeśli nie jest 1 i temperatura nie jest wieksza niz
{
  digitalWrite(8, HIGH); //praca
 delay(czas);//czas trwania przerwy pomiedzy impulsami

[color=#363636][size=small]  }[/size][/color]
[color=#363636][size=small]  else {[/size][/color]
[color=#363636][size=small]  digitalWrite(8, LOW); //Wyłączenie[/size][/color]
  }
Kolejny if jest zbędny.
Dawanie tu delay też jest słabe, bo jak w trakcie temperatura zostanie przekroczona to się nie wyłączy.
Jarewa Ci to napisał, ale jedna linijka to pewnie było za krótko.
Nie bo nie tam dał gdzie trzeba Wink miał pozbyć się tego ostatniego warunku jak ty to zrobiłeś...