Pomoc s hlídacím psem
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.
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.
Pomoc s hlídacím psem
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
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
- 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
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é).
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Pomoc s hlídacím psem
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.
- 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
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.
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Pomoc s hlídacím psem
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
- 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
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
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Pomoc s hlídacím psem
tohle je překlad pod fotečkama bod 5. - Step 5: How to UseKdyž program nějak naběhne píše display hned Push to program a Set temp =50 a spodní řádek bliká.
lcd je zřejmě v pořádkuPo 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í.
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);
}
}
Re: Pomoc s hlídacím psem
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 .
Re: Pomoc s hlídacím psem
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
Re: Pomoc s hlídacím psem
Ten encoder jsi zapojil správně. Zkus ještě zapnout na vstupech enkoderu pullup, pokud je nějaký problém s rezistory v enkoderu.
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é.
Kód: Vybrat vše
// Rotary pulses are INPUTs
pinMode(PinA, INPUT_PULLUP);
pinMode(PinB, INPUT_PULLUP);
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é.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti