Pomoc s hlídacím psem

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
glober
Příspěvky: 8
Registrován: 28 lis 2020, 17:37
Reputation: 0
Bydliště: Český Brod

Pomoc s hlídacím psem

Příspěvek od glober » 28 lis 2020, 18:15

Ahoj, potřeboval bych identifikovat problém. Chci dát dohromady https://create.arduino.cc/projecthub/bi ... ter-4a0ebb a nedaří se mi. Jsem úplný začátečník, mám UNO R3 a NANO R3. Bez problemu jsem rozběhnul základní programy,
neopixely a tak. Ale u 3D Printer Thermal Runaway Watchdog vše zapojím, nahraju program a potom se dějí různé věci. Program někdy nenaběhne nebo jen nějak napůl. Při napájení ze zdroje - nabíječka na telefon naběhne program vždy (ale nedá se ovládat - popíšu dále) při napájení z PC, jiného zdroje nebo Powerbanky většinou nenaběhne a v horním řádku displeje svítí komplet všechny čtverečky. Tohle platí pro UNO i NANO. Když program nějak naběhne píše display hned Push to program a Set temp =50 a spodní řádek bliká. Trochu to vypadá jako by se pořád mačkal enkodér, ukazuje se teplota která se mění většinou od 50 do 300 st.C . Enkodery vyzkoušeny dva, beze změny. Zapojení jsem kontroloval několikrát, dělá to i když enkoder není připojen. Při zmáčknutí enkoderu bzučák pípne. Napájení z USB nebo Vin (ze zdroje 9V 1A) . Možná je chyba v zapojení, napájení nebo mi chybí v programování nějaká knihovna nebo tak. Ze schematu mi není úplně jasné zapojeni enkoderu , mám to GND-GND, + na 5V, SW - D8, DT - A3, CLK - A2.
Díky Jirka

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Pomoc s hlídacím psem

Příspěvek od pavel1tu » 28 lis 2020, 18:45

Buď máš něco blbě, nebo špatný kontakt, možná i rušení ....
Co má být jak zapojené je jasné buď z obrázku a nebo s kodu (jsou tam popisky co je kam připojené).
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

ondraN
Příspěvky: 934
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Pomoc s hlídacím psem

Příspěvek od ondraN » 28 lis 2020, 19:33

Máš to pájené, nebo udělané jenom na kontaktním poli? Doporučuji kontaktní pole vůbec nepoužívat a dát to dohromady na nějakém univerzálním plošném spoji a pak bádat dále.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Pomoc s hlídacím psem

Příspěvek od pavel1tu » 28 lis 2020, 19:48

Koukni kde se to kousne do výpisu na serial,
nebo si tam dodělej hlášky aby jsi věděl kam až program doběhne.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

glober
Příspěvky: 8
Registrován: 28 lis 2020, 17:37
Reputation: 0
Bydliště: Český Brod

Re: Pomoc s hlídacím psem

Příspěvek od glober » 28 lis 2020, 20:16

Mám kontaktní pole, final bude pájený, předělám to hned. Rušení by to mohlo být, zapojení jsem rozložil a složil několikrát, chybu jsem nenašel. Zkoušeno na dvou deskách, UNO a NANO, zkoušeny dva enkodery 040, dvě relé, display mám jen jeden. Vždy se stejným výsledkem. Odpojoval jsem i rele a enkoder a bez výsledku. Dal jsem kondik na napajeni periferii a taky nic. Jdu bádat

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Pomoc s hlídacím psem

Příspěvek od pavel1tu » 28 lis 2020, 22:18

A ten displej vyzkoušej podle nějakého příkladu z netu samotný.
Nic jiného mne nenapadá, je to tak jednoduché.

Encoder nemám, displej ano, zítra večer budu doma tak si to složím
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Hanz
Příspěvky: 262
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Pomoc s hlídacím psem

Příspěvek od Hanz » 29 lis 2020, 00:41

Když program nějak naběhne píše display hned Push to program a Set temp =50 a spodní řádek bliká.
tohle je překlad pod fotečkama bod 5. - Step 5: How to Use
Po zapnutí se na obrazovce zobrazí aktuální teplota a maximální pozorovaná teplota.
Na obrazovce se také zobrazí aktuální cílová teplota v nastavení.
Chcete-li vymazat maximální teplotu, stiskněte knoflík na rotačním kodéru.
Nastavte novou cílovou teplotu otočením knoflíku na rotačním kodéru, stisknutím knoflíku uložte nastavení.
Pokud je detekován tepelný únik, Watchdog vypne napájení tiskárny a generuje zvuk alarmu po dobu 1 minuty. Napájení zůstane vypnuto, dokud není Watchdog ručně resetován.
Chcete-li resetovat alarm tepelného úniku a obnovit napájení tiskárny, stiskněte knoflík na rotačním kodéru.
Všechny informace včetně maximální teploty, nastavení cíle a stavu alarmu jsou uloženy v EEPROM proti ztrátě napájení.
lcd je zřejmě v pořádku
program chce nastavit a pak potvrdit teplotu

tady je kod zmiňovaný vprvním odkazu https://create.arduino.cc/projecthub/bi ... ter-4a0ebb

Kód: Vybrat vše

/**The MIT License (MIT)
Copyright (c) 2018 by ArtSuzhou 
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
 

/*V5 adding rotary encoder*/
/*V5c adding the setting mode for display
 * 
 */
/*
 *  GND ----[NTC]---*---[100k]---- 3.3V
 *                  |
 *                  |
 *                  A0
*/


/********************************/
// include the library code
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
/**********************************************************/

// initialize the library with the numbers of the interface pins. SDA-->A4, SCL-->A5
LiquidCrystal_I2C lcd(0x27, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
/*********************************************************/

// which analog pin to connect
#define THERMISTORPIN A0         
// resistance at 25 degrees C
#define THERMISTORNOMINAL 100000      
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 3950
// the value of the 'other' resistor
#define SERIESRESISTOR 100000    
 
uint16_t samples[NUMSAMPLES];
#define NUMALARM 30

int led =13; // led is at pin 13
int temp_pin = 4; //12 power relay pin
int buzz_pin = 5; //pin for buzzer
int counter;
int set_mode = 0; //if in the temp. set mode

// Used for generating interrupts using CLK signal
const int PinA = 2; 
// Used for reading DT signal
const int PinB = 3;  
// Used for the push button switch
const int PinSW = 8;  

int    alarm_state = EEPROM.read(0);
double setTemp= EEPROM.read(1);
double maxtemp= EEPROM.read(2); 
double newTemp = setTemp;
float  temp;  

void setup()
{
  Serial.begin(115200);
  analogReference(EXTERNAL);
  pinMode (led,OUTPUT);  // make led or pin13 an output
  pinMode (temp_pin,OUTPUT);  // make temp_pin or pin4 an output for relay
  pinMode (buzz_pin,OUTPUT);  // make buzz_pin an output for buzzer

   // Rotary pulses are INPUTs
  pinMode(PinA, INPUT);
  pinMode(PinB, INPUT);
  // Switch is floating so use the in-built PULLUP so we don't need a resistor
  pinMode(PinSW, INPUT_PULLUP);
  // Attach the routine to service the interrupts
  attachInterrupt(digitalPinToInterrupt(PinA), isr, LOW);    

  // Ready to go!
  Serial.println("Start");
  
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  introScreen();
  lcd.clear(); // clear the lcd
  
  counter = 0; 
  if (setTemp == 255){
    setTemp=110.00; 
    EEPROM.update (1,setTemp);
    }; //set default temp target to 110 *c if not set
  if (maxtemp == 255){
    maxtemp=temp;
    };
  if (alarm_state != 1){
    alarm_state=0;
    digitalWrite (led, 0);
    digitalWrite (temp_pin, 0);
    }
    else 
    {
    digitalWrite (led, 1); // turn on the led
    digitalWrite (temp_pin, 1); // turn off the relay  
    };
}

/*********************************************************/

void loop(){
  counter++;
  getTemp();
  lcd.setCursor (0,0);   // set the cursor to 0,0
  lcd.print("                ");
  lcd.setCursor (0,0);   // set the cursor to 0,0
  lcd.print("Temp = ");
  lcd.print(temp);   
  lcd.print(" *C");

  if ((!digitalRead(PinSW))) {
   maxtemp=0;
   //while (!digitalRead(PinSW))
   digitalWrite(buzz_pin, HIGH);
   delay(100);
   digitalWrite(buzz_pin, LOW);
   lcd.clear();
   Serial.println("Reset");
   lcd.setCursor (0,0);   // set the cursor to 0,0
   lcd.print ("  Reset Done");
   lcd.setCursor (0,1);   // set the cursor to 0,0
   if (alarm_state == 1){
      alarm_state=0;
      lcd.print (" Alarm Cleared");
      EEPROM.update (0,alarm_state); 
    }
    else{
      lcd.print ("Max. Temp Reset");
    }
    delay(1000);
  }

   setTemp = EEPROM.read(1); // read the setTemp on the eeprom

   if (temp > setTemp) // if the temperature exceeds your chosen setTemp
   {
   digitalWrite (led, 1); // turn on the led
   digitalWrite (temp_pin, 1); // turn off the relay
   alarm_state=1;

   lcd.clear();
   lcd.setCursor (0,0);
   lcd.print ("****Caution****");
   lcd.setCursor (0,1);    
   lcd.print ("Thermal Runaway"); // Print thermal runaway protection activated

   alarm(); //sound buzzer
   }
   else 
   {
   if (alarm_state !=1){
   digitalWrite (led,0);
   digitalWrite (temp_pin, 0); // turn the power on if no alarm
   }
 }

   if (temp > maxtemp) {   //update the maxtemp
   maxtemp = temp;  
   }

   lcd.setCursor (0,1);   // set the cursor to 0,1
   lcd.print("                ");
   lcd.setCursor (0,1);   // set the cursor to 0,1
   if (counter < 3) {
   if (alarm_state ==1){
   lcd.print ("Thermal Runaway"); // Print thermal runaway protection activated
   delay(1000);
   lcd.setCursor (0,1);    
   lcd.print("                ");
   lcd.setCursor (0,1);
   lcd.print ("[Press to Rest]"); 
   }
   else {
   lcd.print ("[Power is Good]");  // Print Power is normal
   }
  }
   else {
   if (counter >=3 && counter <5){
   lcd.print ("Set To "); // Print set to and your ideal temperature in C
   lcd.print (setTemp, 2);
   lcd.print (" *C");
 }
   else {
   lcd.print ("Max. = "); // Print set to and your max. temperature in C
   lcd.print (maxtemp, 2);
   lcd.print (" *C");  }
   if (counter == 6) {
    counter = 0;
  }
}

while (set_mode) {
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Push to Program");
   lcd.setCursor(0, 1);
   lcd.print("Set Temp =");
   lcd.print(newTemp, 0);
   lcd.print (" *C");
   delay(1000);
    // Write out to serial monitor the value and direction
   Serial.print(newTemp > setTemp ? "Up  :" : "Down:");
   Serial.println(newTemp);

   // Is someone pressing the rotary switch?
   if ((!digitalRead(PinSW))) {
   setTemp = newTemp;
   EEPROM.update (1,setTemp);

   digitalWrite(buzz_pin, HIGH);
   delay(100);
   digitalWrite(buzz_pin, LOW); 
   lcd.setCursor(0, 0);
   lcd.print("                ");
   lcd.setCursor(0, 0);
   lcd.print("New Temp. Set");

   setTemp = newTemp ;
   Serial.println("New Temp Set");
   set_mode = 0;
   
  }
}
  
Serial.print("Set Temperature "); 
Serial.println(setTemp);  // Print the setTemp in the serial montior
Serial.print("Alarm State "); 
Serial.println(alarm_state);  // Print the Alarm State in the serial montior

EEPROM.update (0,alarm_state); /* write the most recent setTemp in eeprom data stoage
  so that if the power is disconnected, you alarm state is saved!*/
EEPROM.update (1,setTemp); /* write the most recent setTemp in eeprom data stoage
  so that if the power is disconnected, you setTemp is saved!*/
EEPROM.update (2,maxtemp); /* write the most recent maxtemp in eeprom data stoage*/
delay(1000); // wait 1000 milliseconds            
}


void introScreen()
{
  lcd.setCursor(3, 0);
  lcd.print("3D PRINTER");
  lcd.setCursor(3, 1);
  lcd.print("WATCH  DOG");
  delay(2000);
  lcd.clear();
}

void isr ()  {
  static unsigned long lastInterruptTime = 0;
  unsigned long interruptTime = millis();

  // If interrupts come faster than 5ms, assume it's a bounce and ignore
  if (interruptTime - lastInterruptTime > 5) {
    if (digitalRead(PinB) == LOW)
    {
      newTemp-- ; 
    }
    else {
      newTemp++ ; 
    }
    // Restrict value from 50 to +300
    newTemp = min(300, max(50, newTemp));
    // Keep track of when we were here last (no more than every 5ms)
    lastInterruptTime = interruptTime;
    set_mode = 1;
  }
}

void getTemp() {
  uint8_t i;
  float average;

  // take N samples in a row, with a slight delay
  for (i=0; i< NUMSAMPLES; i++) {
   samples[i] = analogRead(THERMISTORPIN);
   delay(10);
  }
 
  // average all the samples out
  average = 0;
  for (i=0; i< NUMSAMPLES; i++) {
     average += samples[i];
  }
  average /= NUMSAMPLES;
 
  Serial.print("Average analog reading "); 
  Serial.println(average);
 
  // convert the value to resistance
  average = 1023 / average - 1;
  average = SERIESRESISTOR / average;
  Serial.print("Thermistor resistance "); 
  Serial.println(average);

  temp = average / THERMISTORNOMINAL;     // (R/Ro)
  temp = log(temp);                  // ln(R/Ro)
  temp /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
  temp += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
  temp = 1.0 / temp;                 // Invert
  temp -= 273.15;                         // convert to C
 
  Serial.print("Temperature "); 
  Serial.print(temp);
  Serial.println(" *C");

}

void alarm()
{
   uint8_t i;
   for (i=0; i< NUMALARM; i++) {
   digitalWrite(buzz_pin, HIGH);
   delay(500);
   digitalWrite(buzz_pin, LOW); 
   delay(500);
   }
 }
taky pozor na připojení k pinu A0

glober
Příspěvky: 8
Registrován: 28 lis 2020, 17:37
Reputation: 0
Bydliště: Český Brod

Re: Pomoc s hlídacím psem

Příspěvek od glober » 29 lis 2020, 08:22

Ta teplota 50 je tam po spusteni jen kratce hned rychle prebehne na 300. Ovladat to nejde, kdyz zmacknu enkoder tak se na display objevi nastavovani ale okamzite se to vraci zpet tak rychle ze to ani neprectu. At enkoder stisknu a pustim nebo drzim. Kdyz ho drzim tak se to porad prepina tam a zpet. Neda se ovladat ani nastavit. Vypada to jako by neco delal nebo se to ovladalo samo. Asi to bude to ruseni. Asi jsem zapomel rict ze desky nejsou orig ale ,,precizni klon'' .Displej vyzkousen v jinem programu funguje ok. Pin 0 je ok. Zkousel jsem serial monitor, ale zatim se mi to neovedlo rozchodit. Jeste sem zjistil ze se to bud zasekne uplne nebo neco dela a vypada ze je zahlcen, v tom pripade je videt ze nejakym zpusobem reaguje na termistor. Ted me napadlo ze na strope mam pet led svetel, kazdy ma svuj rusici zdroj a termistor ma dve metrovy anteny 😀.

glober
Příspěvky: 8
Registrován: 28 lis 2020, 17:37
Reputation: 0
Bydliště: Český Brod

Re: Pomoc s hlídacím psem

Příspěvek od glober » 29 lis 2020, 10:35

Rusicky vypnuty,porad stejne. Rozebral jsem to, slozil, termistor zkracen na 10cm nahral program znovu a porad stejne. Uz zkousim jen UNO. Napajeno ze zdroje 9V nebo powbanky USB. Zdroj napajeni ma na problem vliv. Pri napajeni z USB pocitace to z 90% nenabehne vubec, z 9V naběhne vždy, kdyz nahraju program, tak se to samo nerozebehne, coz u jinych programu neni problem. Az po odpojeni USB. Pripominam ze jsem zacatecnik a mam arduino 6 dni. Možná dělám nějakou základní chybu nebo nemám knihovnu, nevim. Nahrával jsem jen knihovnu disleje s I2C a knihovnu NeoPixel, taky prevodnik pro NANO . Pisou tam jeste EPPROM ale to mi psalo něco jakože to už obsahuje, ale nejsem si jisty. Pak jsem zkoušel různé příklady a vše makalo, od blikací diody, znaky na displeji a neopixely, vše makalo bez problemu, i pri napajeni z USB NTB. Díky

ondraN
Příspěvky: 934
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Pomoc s hlídacím psem

Příspěvek od ondraN » 29 lis 2020, 17:50

Ten encoder jsi zapojil správně. Zkus ještě zapnout na vstupech enkoderu pullup, pokud je nějaký problém s rezistory v enkoderu.

Kód: Vybrat vše

   // Rotary pulses are INPUTs
  pinMode(PinA, INPUT_PULLUP);
  pinMode(PinB, INPUT_PULLUP);
  
Dále bych na napájení dal kondenzátor větší jak 1000M a paralelně k němu 100n. GND a 5V k enkodéru veď přímo z pinů arduina a mezi GND a 5V dej těsně u enkodéru zase konenzátor 100n. Napájení modulu relé dej co nejblíže ke zdroji (ještě před tím kondenzátorem) a těsně u modulu relé zapoj na napájení kondenzátor 100M a paralelně k němu 100n. Ta paralelní konbinace kondenzátorů se používá kvůli tomu, že větší elektrolyty mají dost velký sériový odpor a nepochytají signály vyšších frekvencí, zato ty 100n jsou keramické a s nízkým sériovým odporem.
Ještě múžeš zkusit vypnout napájení toho reléového modulu (stačí 5V), aby jsi zjistil, jestli tam ten bordel nedělá to relé.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů