Skocz do zawartości

Podłączenie przekaźnika - problem


deprimo

Pomocna odpowiedź

Witam wszystkich forumowiczów! 🙂

Z góry przepraszam, ale dopiero zaczynam przygodę z Arduino. Chciałem podłączyć przekaźnik do Arduino UNO, jednak nie wiem czy moje myślenie jest prawidłowe. Przy próbie podłączenia pompa nie załącza się.

Zakupiłem taki przekaźnik 5V -> 12V, 2 kanałowy:

http://imge.pl/p/75409/n/754093961936.png

Próbuje do niego podłączyć pompkę wodną jak na schemacie:

Dodam, że na przełączniku widnieje dioda, która sygnalizuje stan wysoki/niski i sterowanie poprzez Arduino działa, dioda przełącza się odpowiednio.

Proszę o pomoc 🙂

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

Kolejny przykład jak durna dokumentacja a raczej w zasadzie jej brak nie pozwala na poprawne użycie modułu. Ten sam moduł widzę w Botlandzie, ale tam też zero podłączania, tylko jakiś odsyłacz do zupełnie innej płytki plus bezużyteczna dokumentacja samych przekaźników.

Skoro nie znalazłem nigdzie schematu tego pomarańczowego cuda, więc to są tylko moje domysły:

1. Żeby w ogóle uruchomić przekaźniki, potrzebujesz napięcia 12V bo na tyle są przewidziane ich cewki. Podłączasz zatem GND swojego Arduino do pinu "DC-", natomiast +12V z zasilacza podłączasz do "DC+". Wyjście +5V z Arduino nie jest tu potrzebne i nigdzie go nie podłączasz. Zworki ustawiasz w pozycję HIGH, tj. będziesz odpalał przekaźnik stanem wysokim na wyjściu cyfrowym. Tak jest bezpieczniej.

2. Nie wiem co tam po drodze dałeś - co to jest ten czarny grzybek z piorunem i po co, więc do tego się nie odnoszę. W każdym razie potrzebujesz zasilania pompy i puszczasz je do niej przez kontakty COM i NO któregoś przekaźnika - to zrobiłeś dobrze.

Załączany przekaźnik wyraźnie "cyka" przy zmianach stanu. W ciszy słychać to wyraźnie w całym pokoju. Dopóki tego nie słyszysz, diodki mogą się zapalać do woli. Zanim coś podłączysz, lepiej pokaż nowy schemat bo źle podłączone 12V może Arduino bardzo zaszkodzić.

Oczywiście użycie tutaj optoizolatorów to kompletny bezsens, ale zaczynam się powoli przyzwyczajać do głupoty producentów takich wynalazków.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

No wszystko jest w porządku (pomijając fakt, że Arduino nie ma zasilania). Gdzie problem?

W sumie... Jakbyś podał link do miejsca gdzie ten przekaźnik kupiłeś zamiast artystycznego zdjęcia z natury - może byśmy coś więcej powiedzieli... Na razie na pdstawie tego co podałeś możemy stwierdzić, że jest bardzo ładny i idealnie skomponuje się np. z różową obudową do Arduino.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ogólnie OK. Zmień tylko pin sterujący na jakiś inny, nr. 2-13. Akurat piny RXD/TXD procesora są podłączone wewnętrznie w Arduino do konwertera USB/UART i służą do ładowania nowych programów i do komunikacji z PC. A na dodatek RXD jest w tej konstrukcji domyślnie wejściem do procesora, więc skucha podwójna. Są tam co prawda oporniki szeregowe, ale po co kusić licho? Jeśli nie musisz, raczej nigdzie nie używaj pinów 0 i 1, chyba że musisz i dokładnie wiesz co robisz.

Zasilacz ma wystarczyć do pompy. Nie wiem jaką masz więc trudno te 3A ocenić.

Z tego samego zasilacza możesz napędzać Arduino poprzez gniazdko Vin. Masz wtedy jedno źródło i mniej kabli.

Link do komentarza
Share on other sites

Podłączyłem wszystko zgodnie ze schematem, który wstawiłem i przekaźnik zadziałał. Wcześniej po prostu zasilacz miał za małe napięcie, zgodnie z tym co pisał marek1707. Dzięki za pomoc 🙂!

Co do zasilania arduino zasilaczem 12v, nie będzie problemu?

P.S

Nie wiem gdzie wstawić to pytanie, a nie chce zaśmiecać forum, może ktoś z Was jeszcze pomoze mi zrozumieć podłączenie w projekcie: https://github.com/Deeplocal/mocktailsmixer

Tutaj jest schemat podłączenia

https://github.com/Deeplocal/mocktailsmixer/raw/master/diagrams/wiring_diagram.png

Z tego co wyczytałem są 2 zasilacze, które odpowiednio zasilają wszystkie pompy + arduino + raspberry i pozostałe rzeczy. Nie za bardzo jednak rozumiem tej części schematu:

Czy ktoś byłby w stanie mi wytłumaczyc jak to jest podpięte?

Link do komentarza
Share on other sites

Co do zasilania z 12V teoretycznie powinno to działać... ale to wartość graniczna i stabilizator w Arduino będzie się grzać.

Ja mając do dyspozycji tylko 12V puszczam to przez 7809 - zawsze tam mogę jskiś radiatorek zainstalować, a Arduino będzie bezpieczny.

No - ale to mój sposób i pewnie są lepsze

O reszcie się nie wypowiem, nie znam się zbyt dobrze na sztuce abstrakcyjnej...

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Te zielone łączówki zwierają wszystkie wchodzące do nich kable razem.

Czarny kabel to masa i obie masy zasilaczy są zwarte ze sobą i ze wszystkim co GND potrzebuje.

Zielony to +5V, zasila oba komputerki, diodki LED, wzmacniacz(?) audio.

Czerwony to +12V i z tego napędzane są przekaźniki i pompy.

Stabilizator w Arduino wytrzymuje 16V a 20V to jego absolutny max. Ten Twój zasilacz - jeżeli rzeczywiście tak wygląda jak na zdjęciu i rzeczywiście jest "12V" to możesz go bezpiecznie podłączyć. Scalak stabilizatora na płytce Arduino grzać się nie będzie (z resztą od tego ma radiator) za mocno, bo wg schematu (no dobra, rysunku) niczego więcej z niego nie zasilasz oprócz samej płytki. Dopóki nie wyciągasz z Arduino 5V do czegoś na zewnątrz, możesz używać jednego zasilacza 12V do wszystkiego.

Link do komentarza
Share on other sites

Dzięki!!!

Czyli tylko celem potwierdzenia

Schemat powyżej, a mówiąc więcej, ta "zielona płytka" zwiera ze sobą wszystkie 5V, które kolejno są podłączone do zasilacza, tak?

Link do komentarza
Share on other sites

Tak, to schemat tzw. montażowy w którym rysowane są prowadzenia kabli i sposób ich łączenia. Po prostu w praktyce ciężko skręcić razem wiele kabli i umieścić je pod jedną śrubką zasilacza. Na schemacie ideowym byłyby po prostu zwarte i podpięte pod 5 lub 12V a tutaj masz pokazaną listwę dla tych co takich instalacji nie ogarniają. To może np. taka szyna z zaciskami śrubowymi:

https://www.tme.eu/pl/details/1518040/listwy-zaciskowe/pce/

lub coś takiego do szybkiego łączenia odizolowanych drutów:

https://www.tme.eu/pl/details/qlx8-gcl/szybkozlaczki/nichifu/qlx-8-gcl/

https://www.tme.eu/pl/details/dg223-4.61-05p-11/szybkozlaczki/degson-electronics/dg223-461-05p-11-00ah/

Na pewno znajdziesz coś podobnego w sklepie lub hurtowni elektrycznej. Ważne, by łączyło wszystko razem a nie robiło N osobnych torów:

https://www.tme.eu/pl/details/bmm92cs/listwy-zaciskowe/bm-group/bm-m92cs/

  • Lubię! 1
Link do komentarza
Share on other sites

Witam Serdecznie Kolegów!

 

Słuchajcie... Wiem że spotkam się z nie małym hejtem typu, nie znasz się na programowaniu to się nie bierz itp... 

 

Projekt jest taki.: Belka tensometryczna, wzmacniacz belki, Arduino i przekaźnik. Ważenie już działa proszę tylko o pomoc lub ewentualne podpowiedzi jak zsynchronizaować wagę aby sterowała przekaźnikiem? Przekaźnik będzie sterował Elektrozaworem. I tak wstawiam pojemnik na wagę i otwarcie zaworu powinno nastąpić właśnie w momencie odczytania wagi pustego pojemnika nastepnie zamknięcie zaworu po uzyskaniu odpowiedniego poziomu w pojemniku.

 

Macie jakieś pomysły? Jakaś pomoc?

 

Pozdrawiam!

 

Krzysiek

Link do komentarza
Share on other sites

Witaj na forum 🙂 

22 godziny temu, Krisu880 napisał:

Słuchajcie... Wiem że spotkam się z nie małym hejtem typu, nie znasz się na programowaniu to się nie bierz itp... 

To nie jest elektroda tylko Forbot 🙂 Tutaj panują wyższe standardy szacunku do innych osób, przecież każdy się uczył i nikt wszystkiego nie potrafi.

22 godziny temu, Krisu880 napisał:

jak zsynchronizaować wagę aby sterowała przekaźnikiem

Przykład:

float odczytWagi; // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
float minMasaPojemnika = 1; // 1g
float minMasaDoZamkniecia = 100; // 100g

// Umiescic w loop();
if(odczytWagi >= minMasaDoZamkniecia)
{
  // Zamknij zawór
}
else if(odczytWagi >= minMasaPojemnika)
{
 // Otwórz zawór 
}
else
{
  // (Stan krytyczny - brak pojemnika na wadze, natychmiast zamknij zawór)
  // Zamknij zawór
}

>> Tylko pamiętaj, że reakcja tego skryptu będzie natychmiastowa na dany odczyt z wagi <<, więc polecam dodać ewentualnie jakąś weryfikację odczytu np. przez 100-200ms. Pozwoli to zapobiec sytuacji jak np. ktoś podnosi pojemnik z cieczą z wagi i nagle waga wykrywa, że pojemnik nie jest pełen, więc otwiera zawór.

Więcej możesz doczytać w tym artykule kursu. (Nie lubię podawać gotowych rozwiązań na tacy, bo w ten sposób nikt się jeszcze niczego nie nauczył).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@H1M4W4R1 Dzieki bardzo za podpowiedź 

oczywiście skorzystam z funkcji DELAY ale póki co nie moge zaadresować tego kodu zęby czytał wyniki z Wagi, które są tworzone z kodu który już mam... powoli tracę zapał do tego projektu. 

 

Mimo wszystko kombinuję dalej 🙂

Tak wygląda mój KOD jakby komuś się chciało przeanalizować. Oczywicie skopiowany z innej Wagi ale jako jeden z nielicznych działa. nie wiem tylko jakie parametry wprowadzić aby czytało wyniki ważenia 😞

/*
   -------------------------------------------------------------------------------------
   HX711_ADC
   Arduino library for HX711 24-Bit Analog-to-Digital Converter for Weight Scales
   Olav Kallhovd sept2017
   -------------------------------------------------------------------------------------
*/

/*
   This example file shows how to calibrate the load cell and optionally store the calibration
   value in EEPROM, and also how to change the value manually.
   The result value can then later be included in your project sketch or fetched from EEPROM.

   To implement calibration in your project sketch the simplified procedure is as follow:
       LoadCell.tare();
       //place known mass
       LoadCell.refreshDataSet();
       float newCalibrationValue = LoadCell.getNewCalibration(known_mass);
*/

#include <HX711_ADC.h>
#include <EEPROM.h>

//pins:
const int HX711_dout = 4; //mcu > HX711 dout pin
const int HX711_sck = 5; //mcu > HX711 sck pin
int ledPin = 2;
float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
float minMasaPojemnika = 325; // 1g
float minMasaDoZamkniecia = 1325; // 100g

//HX711 constructor:
HX711_ADC LoadCell(HX711_dout, HX711_sck);

const int calVal_eepromAdress = 0;
unsigned long t = 0;

void setup() {
  Serial.begin(57600); delay(1000);
  Serial.println();
  Serial.println("Starting...");
  pinMode(ledPin, OUTPUT);

  LoadCell.begin();
  unsigned long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
  boolean _tare = false; //set this to false if you don't want tare to be performed in the next step
  LoadCell.start(stabilizingtime, _tare);
  if (LoadCell.getTareTimeoutFlag() || LoadCell.getSignalTimeoutFlag()) {
    Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
    while (1);
  }
  else {
    LoadCell.setCalFactor(1.0); // user set calibration value (float), initial value 1.0 may be used for this sketch
    Serial.println("Startup is complete");
  }
  while (!LoadCell.update());
  calibrate(); //start calibration procedure

  
  float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
  float minMasaPojemnika = 325; // 1g
  float minMasaDoZamkniecia = 1325; // 100g
}

void loop() {
  static boolean newDataReady = 0;
  const int serialPrintInterval = 0; //increase value to slow down serial print activity

  // check for new data/start next conversion:
  if (LoadCell.update()) newDataReady = true;

  // get smoothed value from the dataset:
  if (newDataReady) {
    if (millis() > t + serialPrintInterval) {
      float i = LoadCell.getData();
      Serial.print("Load_cell output val: ");
      Serial.println(i);
      newDataReady = 0;
      t = millis();
    }
  }

  // receive command from serial terminal
  if (Serial.available() > 0) {
    char inByte = Serial.read();
    if (inByte == 't') LoadCell.tareNoDelay(); //tare
    else if (inByte == 'r') calibrate(); //calibrate
    else if (inByte == 'c') changeSavedCalFactor(); //edit calibration value manually
  }

  // check if last tare operation is complete
  if (LoadCell.getTareStatus() == true) {
    Serial.println("Tare complete");

if(odczytWagi >= minMasaDoZamkniecia)
{
digitalWrite(ledPin, LOW); // Zamknij zawór
}
else if(odczytWagi >= minMasaPojemnika)
{
digitalWrite(ledPin, HIGH); // Otwórz zawór 
}
else if (odczytWagi = 0)
{
digitalWrite(ledPin, LOW);  // (Stan krytyczny - brak pojemnika na wadze, natychmiast zamknij zawór)
  // Zamknij zawór
}
  
}

}

void calibrate() {
  Serial.println("***");
  Serial.println("Start calibration:");
  Serial.println("Place the load cell an a level stable surface.");
  Serial.println("Remove any load applied to the load cell.");
  Serial.println("Send 't' from serial monitor to set the tare offset.");

  boolean _resume = false;
  while (_resume == false) {
    LoadCell.update();
    if (Serial.available() > 0) {
      if (Serial.available() > 0) {
        char inByte = Serial.read();
        if (inByte == 't') LoadCell.tareNoDelay();
      }
    }
    if (LoadCell.getTareStatus() == true) {
      Serial.println("Tare complete");
      _resume = true;
    }
  }

  Serial.println("Now, place your known mass on the loadcell.");
  Serial.println("Then send the weight of this mass (i.e. 100.0) from serial monitor.");

  float known_mass = 0;
  _resume = false;
  while (_resume == false) {
    LoadCell.update();
    if (Serial.available() > 0) {
      known_mass = Serial.parseFloat();
      if (known_mass != 0) {
        Serial.print("Known mass is: ");
        Serial.println(known_mass);
        _resume = true;
      }
    }
  }

  LoadCell.refreshDataSet(); //refresh the dataset to be sure that the known mass is measured correct
  float newCalibrationValue = LoadCell.getNewCalibration(known_mass); //get the new calibration value

  Serial.print("New calibration value has been set to: ");
  Serial.print(newCalibrationValue);
  Serial.println(", use this as calibration value (calFactor) in your project sketch.");
  Serial.print("Save this value to EEPROM adress ");
  Serial.print(calVal_eepromAdress);
  Serial.println("? y/n");

  _resume = false;
  while (_resume == false) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.begin(512);
#endif
        EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.commit();
#endif
        EEPROM.get(calVal_eepromAdress, newCalibrationValue);
        Serial.print("Value ");
        Serial.print(newCalibrationValue);
        Serial.print(" saved to EEPROM address: ");
        Serial.println(calVal_eepromAdress);
        _resume = true;

      }
      else if (inByte == 'n') {
        Serial.println("Value not saved to EEPROM");
        _resume = true;
      }
    }
  }

  Serial.println("End calibration");
  Serial.println("***");
  Serial.println("To re-calibrate, send 'r' from serial monitor.");
  Serial.println("For manual edit of the calibration value, send 'c' from serial monitor.");
  Serial.println("***");
}

void changeSavedCalFactor() {
  float oldCalibrationValue = LoadCell.getCalFactor();
  boolean _resume = false;
  Serial.println("***");
  Serial.print("Current value is: ");
  Serial.println(oldCalibrationValue);
  Serial.println("Now, send the new value from serial monitor, i.e. 696.0");
  float newCalibrationValue;
  while (_resume == false) {
    if (Serial.available() > 0) {
      newCalibrationValue = Serial.parseFloat();
      if (newCalibrationValue != 0) {
        Serial.print("New calibration value is: ");
        Serial.println(newCalibrationValue);
        LoadCell.setCalFactor(newCalibrationValue);
        _resume = true;
      }
    }
  }
  _resume = false;
  Serial.print("Save this value to EEPROM adress ");
  Serial.print(calVal_eepromAdress);
  Serial.println("? y/n");
  while (_resume == false) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.begin(512);
#endif
        EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.commit();
#endif
        EEPROM.get(calVal_eepromAdress, newCalibrationValue);
        Serial.print("Value ");
        Serial.print(newCalibrationValue);
        Serial.print(" saved to EEPROM address: ");
        Serial.println(calVal_eepromAdress);
        _resume = true;
      }
      else if (inByte == 'n') {
        Serial.println("Value not saved to EEPROM");
        _resume = true;
      }
    }
  }
  Serial.println("End change calibration value");
  Serial.println("***");

}

 

Link do komentarza
Share on other sites

14 minut temu, Krisu880 napisał:

Tak wygląda mój KOD jakby komuś się chciało przeanalizować.

Zacznijmy od początku

Linijka 60-62:

float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
float minMasaPojemnika = 325; // 1g
float minMasaDoZamkniecia = 1325; // 100g

Widzę tutaj dwa błędy - pierwszy to zastosowanie Serial.read(), który odczytuje dane z UART, a nie z wagi. Dodatkowo problemem jest to, że Serial.read() zwraca wartości z zakresu [0,255].

Drugi - te same zmienne masz zdefiniowane w linijkach 28-30, więc linijki 60-62 powinny wyglądać m/w tak (czytaj: są zbędne):

//odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
//minMasaPojemnika = 325; // 1g
//minMasaDoZamkniecia = 1325; // 100g  - te wartości są ustawione na starcie, więc są zbędne, odczyt jest sprawdzany w innym miejscu

Tym samym idziemy do linijki 79, gdzie dodajemy

odczytWagi = i;

Dla czepialskich - tak można to zrobić lepiej, ale to już zostawiam koledze do analizy i poprawienia 🙂 

Dodatkowo możemy też dodać linijkę

Serial.write("Odczyt z wagi: " + i + "\r\n");

Która będzie zwracała nam do serial monitora aktualny odczyt z wagi. (nie jestem pewien czy zadziała, dawno nie pracowałem z Arduino)

Poprawić też trzeba linijkę 28 i zostawić tylko deklarację:

float odczytWagi; // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)

Ostatecznie kod powinien wyglądać podobnie do tego:

/*
   -------------------------------------------------------------------------------------
   HX711_ADC
   Arduino library for HX711 24-Bit Analog-to-Digital Converter for Weight Scales
   Olav Kallhovd sept2017
   -------------------------------------------------------------------------------------
*/

/*
   This example file shows how to calibrate the load cell and optionally store the calibration
   value in EEPROM, and also how to change the value manually.
   The result value can then later be included in your project sketch or fetched from EEPROM.

   To implement calibration in your project sketch the simplified procedure is as follow:
       LoadCell.tare();
       //place known mass
       LoadCell.refreshDataSet();
       float newCalibrationValue = LoadCell.getNewCalibration(known_mass);
*/

#include <HX711_ADC.h>
#include <EEPROM.h>

//pins:
const int HX711_dout = 4; //mcu > HX711 dout pin
const int HX711_sck = 5; //mcu > HX711 sck pin
int ledPin = 2;
float odczytWagi; // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
float minMasaPojemnika = 325; // 1g
float minMasaDoZamkniecia = 1325; // 100g

//HX711 constructor:
HX711_ADC LoadCell(HX711_dout, HX711_sck);

const int calVal_eepromAdress = 0;
unsigned long t = 0;

void setup() {
  Serial.begin(57600); delay(1000);
  Serial.println();
  Serial.println("Starting...");
  pinMode(ledPin, OUTPUT);

  LoadCell.begin();
  unsigned long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
  boolean _tare = false; //set this to false if you don't want tare to be performed in the next step
  LoadCell.start(stabilizingtime, _tare);
  if (LoadCell.getTareTimeoutFlag() || LoadCell.getSignalTimeoutFlag()) {
    Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
    while (1);
  }
  else {
    LoadCell.setCalFactor(1.0); // user set calibration value (float), initial value 1.0 may be used for this sketch
    Serial.println("Startup is complete");
  }
  while (!LoadCell.update());
  calibrate(); //start calibration procedure

  
  //float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
  //float minMasaPojemnika = 325; // 1g
  //float minMasaDoZamkniecia = 1325; // 100g
}

void loop() {
  static boolean newDataReady = 0;
  const int serialPrintInterval = 0; //increase value to slow down serial print activity

  // check for new data/start next conversion:
  if (LoadCell.update()) newDataReady = true;

  // get smoothed value from the dataset:
  if (newDataReady) {
    if (millis() > t + serialPrintInterval) {
      float i = LoadCell.getData();
      Serial.print("Load_cell output val: ");
      Serial.println(i);
      newDataReady = 0;
      t = millis();
      odczytWagi = i;
      Serial.write("Odczyt z wagi: " + i + "\r\n");
    }
  }

  // receive command from serial terminal
  if (Serial.available() > 0) {
    char inByte = Serial.read();
    if (inByte == 't') LoadCell.tareNoDelay(); //tare
    else if (inByte == 'r') calibrate(); //calibrate
    else if (inByte == 'c') changeSavedCalFactor(); //edit calibration value manually
  }

  // check if last tare operation is complete
  if (LoadCell.getTareStatus() == true) {
    Serial.println("Tare complete");

if(odczytWagi >= minMasaDoZamkniecia)
{
digitalWrite(ledPin, LOW); // Zamknij zawór
}
else if(odczytWagi >= minMasaPojemnika)
{
digitalWrite(ledPin, HIGH); // Otwórz zawór 
}
else if (odczytWagi = 0)
{
digitalWrite(ledPin, LOW);  // (Stan krytyczny - brak pojemnika na wadze, natychmiast zamknij zawór)
  // Zamknij zawór
}
  
}

}

void calibrate() {
  Serial.println("***");
  Serial.println("Start calibration:");
  Serial.println("Place the load cell an a level stable surface.");
  Serial.println("Remove any load applied to the load cell.");
  Serial.println("Send 't' from serial monitor to set the tare offset.");

  boolean _resume = false;
  while (_resume == false) {
    LoadCell.update();
    if (Serial.available() > 0) {
      if (Serial.available() > 0) {
        char inByte = Serial.read();
        if (inByte == 't') LoadCell.tareNoDelay();
      }
    }
    if (LoadCell.getTareStatus() == true) {
      Serial.println("Tare complete");
      _resume = true;
    }
  }

  Serial.println("Now, place your known mass on the loadcell.");
  Serial.println("Then send the weight of this mass (i.e. 100.0) from serial monitor.");

  float known_mass = 0;
  _resume = false;
  while (_resume == false) {
    LoadCell.update();
    if (Serial.available() > 0) {
      known_mass = Serial.parseFloat();
      if (known_mass != 0) {
        Serial.print("Known mass is: ");
        Serial.println(known_mass);
        _resume = true;
      }
    }
  }

  LoadCell.refreshDataSet(); //refresh the dataset to be sure that the known mass is measured correct
  float newCalibrationValue = LoadCell.getNewCalibration(known_mass); //get the new calibration value

  Serial.print("New calibration value has been set to: ");
  Serial.print(newCalibrationValue);
  Serial.println(", use this as calibration value (calFactor) in your project sketch.");
  Serial.print("Save this value to EEPROM adress ");
  Serial.print(calVal_eepromAdress);
  Serial.println("? y/n");

  _resume = false;
  while (_resume == false) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.begin(512);
#endif
        EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.commit();
#endif
        EEPROM.get(calVal_eepromAdress, newCalibrationValue);
        Serial.print("Value ");
        Serial.print(newCalibrationValue);
        Serial.print(" saved to EEPROM address: ");
        Serial.println(calVal_eepromAdress);
        _resume = true;

      }
      else if (inByte == 'n') {
        Serial.println("Value not saved to EEPROM");
        _resume = true;
      }
    }
  }

  Serial.println("End calibration");
  Serial.println("***");
  Serial.println("To re-calibrate, send 'r' from serial monitor.");
  Serial.println("For manual edit of the calibration value, send 'c' from serial monitor.");
  Serial.println("***");
}

void changeSavedCalFactor() {
  float oldCalibrationValue = LoadCell.getCalFactor();
  boolean _resume = false;
  Serial.println("***");
  Serial.print("Current value is: ");
  Serial.println(oldCalibrationValue);
  Serial.println("Now, send the new value from serial monitor, i.e. 696.0");
  float newCalibrationValue;
  while (_resume == false) {
    if (Serial.available() > 0) {
      newCalibrationValue = Serial.parseFloat();
      if (newCalibrationValue != 0) {
        Serial.print("New calibration value is: ");
        Serial.println(newCalibrationValue);
        LoadCell.setCalFactor(newCalibrationValue);
        _resume = true;
      }
    }
  }
  _resume = false;
  Serial.print("Save this value to EEPROM adress ");
  Serial.print(calVal_eepromAdress);
  Serial.println("? y/n");
  while (_resume == false) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.begin(512);
#endif
        EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.commit();
#endif
        EEPROM.get(calVal_eepromAdress, newCalibrationValue);
        Serial.print("Value ");
        Serial.print(newCalibrationValue);
        Serial.print(" saved to EEPROM address: ");
        Serial.println(calVal_eepromAdress);
        _resume = true;
      }
      else if (inByte == 'n') {
        Serial.println("Value not saved to EEPROM");
        _resume = true;
      }
    }
  }
  Serial.println("End change calibration value");
  Serial.println("***");

}

Tylko uprzedzam, pisałem to na sucho, więc może być jakiś błąd, aczkolwiek logikę masz wyjaśnioną powyżej 🙂 

  • Lubię! 1
Link do komentarza
Share on other sites

Dnia 9.02.2021 o 19:13, H1M4W4R1 napisał:

Zacznijmy od początku

Linijka 60-62:


float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
float minMasaPojemnika = 325; // 1g
float minMasaDoZamkniecia = 1325; // 100g

Widzę tutaj dwa błędy - pierwszy to zastosowanie Serial.read(), który odczytuje dane z UART, a nie z wagi. Dodatkowo problemem jest to, że Serial.read() zwraca wartości z zakresu [0,255].

Drugi - te same zmienne masz zdefiniowane w linijkach 28-30, więc linijki 60-62 powinny wyglądać m/w tak (czytaj: są zbędne):


//odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
//minMasaPojemnika = 325; // 1g
//minMasaDoZamkniecia = 1325; // 100g  - te wartości są ustawione na starcie, więc są zbędne, odczyt jest sprawdzany w innym miejscu

Tym samym idziemy do linijki 79, gdzie dodajemy


odczytWagi = i;

Dla czepialskich - tak można to zrobić lepiej, ale to już zostawiam koledze do analizy i poprawienia 🙂 

Dodatkowo możemy też dodać linijkę


Serial.write("Odczyt z wagi: " + i + "\r\n");

Która będzie zwracała nam do serial monitora aktualny odczyt z wagi. (nie jestem pewien czy zadziała, dawno nie pracowałem z Arduino)

Poprawić też trzeba linijkę 28 i zostawić tylko deklarację:


float odczytWagi; // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)

Ostatecznie kod powinien wyglądać podobnie do tego:


/*
   -------------------------------------------------------------------------------------
   HX711_ADC
   Arduino library for HX711 24-Bit Analog-to-Digital Converter for Weight Scales
   Olav Kallhovd sept2017
   -------------------------------------------------------------------------------------
*/

/*
   This example file shows how to calibrate the load cell and optionally store the calibration
   value in EEPROM, and also how to change the value manually.
   The result value can then later be included in your project sketch or fetched from EEPROM.

   To implement calibration in your project sketch the simplified procedure is as follow:
       LoadCell.tare();
       //place known mass
       LoadCell.refreshDataSet();
       float newCalibrationValue = LoadCell.getNewCalibration(known_mass);
*/

#include <HX711_ADC.h>
#include <EEPROM.h>

//pins:
const int HX711_dout = 4; //mcu > HX711 dout pin
const int HX711_sck = 5; //mcu > HX711 sck pin
int ledPin = 2;
float odczytWagi; // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
float minMasaPojemnika = 325; // 1g
float minMasaDoZamkniecia = 1325; // 100g

//HX711 constructor:
HX711_ADC LoadCell(HX711_dout, HX711_sck);

const int calVal_eepromAdress = 0;
unsigned long t = 0;

void setup() {
  Serial.begin(57600); delay(1000);
  Serial.println();
  Serial.println("Starting...");
  pinMode(ledPin, OUTPUT);

  LoadCell.begin();
  unsigned long stabilizingtime = 2000; // preciscion right after power-up can be improved by adding a few seconds of stabilizing time
  boolean _tare = false; //set this to false if you don't want tare to be performed in the next step
  LoadCell.start(stabilizingtime, _tare);
  if (LoadCell.getTareTimeoutFlag() || LoadCell.getSignalTimeoutFlag()) {
    Serial.println("Timeout, check MCU>HX711 wiring and pin designations");
    while (1);
  }
  else {
    LoadCell.setCalFactor(1.0); // user set calibration value (float), initial value 1.0 may be used for this sketch
    Serial.println("Startup is complete");
  }
  while (!LoadCell.update());
  calibrate(); //start calibration procedure

  
  //float odczytWagi = Serial.read(); // Twój odczyt masy z wagi (wyrażony w gramach!!!!!!!)
  //float minMasaPojemnika = 325; // 1g
  //float minMasaDoZamkniecia = 1325; // 100g
}

void loop() {
  static boolean newDataReady = 0;
  const int serialPrintInterval = 0; //increase value to slow down serial print activity

  // check for new data/start next conversion:
  if (LoadCell.update()) newDataReady = true;

  // get smoothed value from the dataset:
  if (newDataReady) {
    if (millis() > t + serialPrintInterval) {
      float i = LoadCell.getData();
      Serial.print("Load_cell output val: ");
      Serial.println(i);
      newDataReady = 0;
      t = millis();
      odczytWagi = i;
      Serial.write("Odczyt z wagi: " + i + "\r\n");
    }
  }

  // receive command from serial terminal
  if (Serial.available() > 0) {
    char inByte = Serial.read();
    if (inByte == 't') LoadCell.tareNoDelay(); //tare
    else if (inByte == 'r') calibrate(); //calibrate
    else if (inByte == 'c') changeSavedCalFactor(); //edit calibration value manually
  }

  // check if last tare operation is complete
  if (LoadCell.getTareStatus() == true) {
    Serial.println("Tare complete");

if(odczytWagi >= minMasaDoZamkniecia)
{
digitalWrite(ledPin, LOW); // Zamknij zawór
}
else if(odczytWagi >= minMasaPojemnika)
{
digitalWrite(ledPin, HIGH); // Otwórz zawór 
}
else if (odczytWagi = 0)
{
digitalWrite(ledPin, LOW);  // (Stan krytyczny - brak pojemnika na wadze, natychmiast zamknij zawór)
  // Zamknij zawór
}
  
}

}

void calibrate() {
  Serial.println("***");
  Serial.println("Start calibration:");
  Serial.println("Place the load cell an a level stable surface.");
  Serial.println("Remove any load applied to the load cell.");
  Serial.println("Send 't' from serial monitor to set the tare offset.");

  boolean _resume = false;
  while (_resume == false) {
    LoadCell.update();
    if (Serial.available() > 0) {
      if (Serial.available() > 0) {
        char inByte = Serial.read();
        if (inByte == 't') LoadCell.tareNoDelay();
      }
    }
    if (LoadCell.getTareStatus() == true) {
      Serial.println("Tare complete");
      _resume = true;
    }
  }

  Serial.println("Now, place your known mass on the loadcell.");
  Serial.println("Then send the weight of this mass (i.e. 100.0) from serial monitor.");

  float known_mass = 0;
  _resume = false;
  while (_resume == false) {
    LoadCell.update();
    if (Serial.available() > 0) {
      known_mass = Serial.parseFloat();
      if (known_mass != 0) {
        Serial.print("Known mass is: ");
        Serial.println(known_mass);
        _resume = true;
      }
    }
  }

  LoadCell.refreshDataSet(); //refresh the dataset to be sure that the known mass is measured correct
  float newCalibrationValue = LoadCell.getNewCalibration(known_mass); //get the new calibration value

  Serial.print("New calibration value has been set to: ");
  Serial.print(newCalibrationValue);
  Serial.println(", use this as calibration value (calFactor) in your project sketch.");
  Serial.print("Save this value to EEPROM adress ");
  Serial.print(calVal_eepromAdress);
  Serial.println("? y/n");

  _resume = false;
  while (_resume == false) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.begin(512);
#endif
        EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.commit();
#endif
        EEPROM.get(calVal_eepromAdress, newCalibrationValue);
        Serial.print("Value ");
        Serial.print(newCalibrationValue);
        Serial.print(" saved to EEPROM address: ");
        Serial.println(calVal_eepromAdress);
        _resume = true;

      }
      else if (inByte == 'n') {
        Serial.println("Value not saved to EEPROM");
        _resume = true;
      }
    }
  }

  Serial.println("End calibration");
  Serial.println("***");
  Serial.println("To re-calibrate, send 'r' from serial monitor.");
  Serial.println("For manual edit of the calibration value, send 'c' from serial monitor.");
  Serial.println("***");
}

void changeSavedCalFactor() {
  float oldCalibrationValue = LoadCell.getCalFactor();
  boolean _resume = false;
  Serial.println("***");
  Serial.print("Current value is: ");
  Serial.println(oldCalibrationValue);
  Serial.println("Now, send the new value from serial monitor, i.e. 696.0");
  float newCalibrationValue;
  while (_resume == false) {
    if (Serial.available() > 0) {
      newCalibrationValue = Serial.parseFloat();
      if (newCalibrationValue != 0) {
        Serial.print("New calibration value is: ");
        Serial.println(newCalibrationValue);
        LoadCell.setCalFactor(newCalibrationValue);
        _resume = true;
      }
    }
  }
  _resume = false;
  Serial.print("Save this value to EEPROM adress ");
  Serial.print(calVal_eepromAdress);
  Serial.println("? y/n");
  while (_resume == false) {
    if (Serial.available() > 0) {
      char inByte = Serial.read();
      if (inByte == 'y') {
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.begin(512);
#endif
        EEPROM.put(calVal_eepromAdress, newCalibrationValue);
#if defined(ESP8266)|| defined(ESP32)
        EEPROM.commit();
#endif
        EEPROM.get(calVal_eepromAdress, newCalibrationValue);
        Serial.print("Value ");
        Serial.print(newCalibrationValue);
        Serial.print(" saved to EEPROM address: ");
        Serial.println(calVal_eepromAdress);
        _resume = true;
      }
      else if (inByte == 'n') {
        Serial.println("Value not saved to EEPROM");
        _resume = true;
      }
    }
  }
  Serial.println("End change calibration value");
  Serial.println("***");

}

Tylko uprzedzam, pisałem to na sucho, więc może być jakiś błąd, aczkolwiek logikę masz wyjaśnioną powyżej 🙂 

Wielkie dzieki za pomoc idę po moje prowizoryczne urządzenie i spróbuję to napisać od nowa. z nadzieją że zadziała

Pozdrawiam Serdecznie

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.