• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Warunkowe zatrzymanie-problem z kodem
#1
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);
  }   
}
 
Odpowiedź
#2
Powinno być tu

if (digitalRead(7) == LOW && x<=23 )
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Może dla tego że jest x<=23, a powinno być x>=23.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
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...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
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);
  } 
   
}
 
Odpowiedź
#6
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
Nie bo nie tam dał gdzie trzeba Wink miał pozbyć się tego ostatniego warunku jak ty to zrobiłeś...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości