pripojme
Vytvořené odpovědi
-
AutorPříspěvky
-
16.2.2016 v 15:09 odpověď na: Násypkometr – ukazatel množství uhlí v násypce u automatického kotle #6051
bobasrobas
ÚčastníkTo vypadá dost lákavě ,jelikož mam taky automat a nebaví mě se chodit koukat do kotelny , nemohl by jsi sem dat aspoň kod ať se s tím nemusím prát , Dík .
Zbyšek Voda
ÚčastníkDobrý den, ještě nám sem prosím zkopírujte text chybové hlášky.
Díkyposjirka
Účastníknavrhoval bych toto řešení. Snad je to dostatečně popsáno. Odzkoušel jsem to na simulátoru a mělo by to fungovat:
const int plus = 11; //tlačítko plus proti zemi const int minus = 12; // tlačítko mínus proti zemi int LED[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // pole pozice/pinů jednotlivých LED diod int pozice = 0; // pozice rozsvícené LED diody resp. číslo vyvodu v poli int i = 0; // pomocna promenna pro pocitadlo unsigned long lastTime = 0; // strojní čas od posledního stisku tlačítka - libovolneho unsigned long prodleva = 250; // kolik ms nebude reagovat na další stisk tlačítka void setup() { pinMode(plus, INPUT_PULLUP); // nastav jako vstup a aktivuj vnitrni pull up odpor pinMode(minus, INPUT_PULLUP); // nastav jako vstup a aktivuj vnitrni pull up odpor pinMode(LED[0], OUTPUT); // nastavení pinu jako výstup pro LED pinMode(LED[1], OUTPUT); // nastavení pinu jako výstup pro LED pinMode(LED[2], OUTPUT); // nastavení pinu jako výstup pro LED pinMode(LED[3], OUTPUT); // nastavení pinu jako výstup pro LED pinMode(LED[4], OUTPUT); // nastavení pinu jako výstup pro LED pinMode(LED[5], OUTPUT); // nastavení pinu jako výstup pro LED pinMode(LED[6], OUTPUT); // nastavení pinu jako výstup pro LED pinMode(LED[7], OUTPUT); // nastavení pinu jako výstup pro LED pozice = 0; // prvotni nastaveni pozice rozsvicene LED diody } void loop() { for (i=0; i <= 7; i++){ // smyčka která projede všech 8 pozic pole LED diod if (i == pozice) { digitalWrite(LED[i], HIGH); // když je i rovno pozici tak rozsvit LED diodu } else { digitalWrite(LED[i], LOW); // jinak zhasni LED diodu } } if(lastTime + prodleva < millis()) { // když aktuální strojový čas mínus prodleva je větší než čas posledního stisku tlačítka ... if(digitalRead(minus) == LOW) { // když je stisknuto tlačítko minus if (pozice > 0) { // a pozice je větší než 0 pozice --; // odečti z pozice číslo 1 lastTime = millis(); // zaznamenej aktuální strojový čas } } if(digitalRead(plus) == LOW) { // když je stisknuto tlačítko plus if (pozice < 7) { // a pozice je větší než 0 pozice ++; // přičti z pozice číslo 1 lastTime = millis(); // zaznamenej aktuální strojový čas } } } }
Zbyšek Voda
ÚčastníkAno. Nepůjde.
Máte pravdu posjirka. Zákmity jsou potvory.
Ještě ideálnější řešení by (podle mě) bylo použít moje řešení společně s vaším čekáním uvnitř podmínky.posjirka
Účastníkpro „pepa48“ ten kod od Zbyškanení úplný a při zkopírování do Arduino IDE ti nepůjde. Šlo o ideové řešení … .
posjirka
Účastníkhezké řešení. mě ale v takto ultrakrátkých smyčkách občas zahaprovalo (zákmity na tlačítku) a načetlo třeba 2-3 pozice navíc. Od té doby jsem přešel na časové prodlevy mezi stisky tlačítka. Variantou je ještě paralelní kapacita na tlačítko pro kompenzaci zákmitů.
Zbyšek Voda
ÚčastníkTa část
stav1 == true && predStav1 != stav1
slouží k tomu, aby systém reagoval při stisku tlačítka. (Tj. jedenkrát při změně z LOW na HIGH).Pokud je tedy tlačítko stisknuto, dojde k zvětšení/zmenšení proměnné i o jedna.
Ta může být použita například jako index v poli, ve kterém máte uložené piny s LEDkami („rozsviť LED, která odpovídá rychlosti 3“)pepa48
ÚčastníkMohl by jste mi to popsat trochu podrobněji, díky 🙂
Zbyšek Voda
ÚčastníkTo bude něco jako
byte tlacitkoPlus = 5; byte tlacitkoMinus = 6; boolean stav1 = false; boolean predStav1 = false; boolean stav2 = false; boolean predStav2 = false; int i = 0; ... void loop(){ stav1 = digitalRead(tlacitkoPlus); if(stav1 == true && predStav1 != stav1){ i++; } predStav1 = stav1; stav2 = digitalRead(tlacitkoMinus); if(stav2 == true && predStav2 != stav2){ i--; } predStav2 = stav2; }
pepa48
ÚčastníkNapadla mě ještě jedna možnost ale protože jsem začátečník tak mi to opět nejde 😀
Jak udělat to normální sčítání a odčítání s tlačítky (+ a -) v programu?
tzn. na začátku svítí dioda1, když zmáčknu + 1. vypne a spustí se druhá a naopak..lukbe
ÚčastníkTak jsem na to přišel 🙂
number= request.substring(5, 10);
posjirka
ÚčastníkTady je otázka kde je problém. Opravdu zvláštní je, že to FAKT MUSÍM PSÁT V KAŽDÉM DOTAZU. BEZ KODU TI NIKDO NEPOMŮŽE.
To že ti problikává barva nemusí být ovladači. Pokud si rozběhl paint tak ovladače jsou v pořádku. Spší když máš knihovnu nastavenou defaultně pro Arduino MEGA tak ho musíš upravit pro UNO, protože pravděpodobně bude používat ty pinu navíc co jsou v 2 řadém kontektoru napravo. Proto se nemusí nastavovat jaký pin co dělá. Pravděpodobně sisi popletl čísla analogových vstupů. Proto ti nejde kalibrace.
S tím blikáním si myslím, že jsi dal do smyčky LOOP neustálé překreslování LCD a proto ti pod vrchní barvou problikává pozadí.Jak jsem psal na začátku … BEZ KODU TO NEJDE.
posjirka
Účastníkomlouvat se nemusíš, jsme jen lidi. Na nefunkčnost můžeme zkusit tradiční postup:
1, překotroluj zapojení, případně rozeber a znovu postav (studeňáky, vypadlý drát,..)
2, vyzkoušej jednoduchý program, který ti LED diodou bude signalizovat jaký je stav na tom pinu// kontrola stavu pinu // by JP 2016 // na vystup s LED diodou zapisuje stav z kontrolovaného pinu int kontrolovanyPin = 8; // sem dej 49slo pinu, ktery potřebuješ ověřit int LED = 13; // pin s LED diodou - pou6ij tu na desce void setup() { pinMode(kontrolovanyPin, INPUT); // nastaven9 pinu najako vstup pinMode(LED, OUTPUT); // nasteven9 pinu 13 na vystup - LED dioda na desce } void loop() { digitalWrite(LED, digitalRead(kontrolovanyPin)); // zapis na pins S LED diodaou stav kontrolovaneho vstupu }
3, zlus jiné čidlo nebo jiný pin (jedno je možná špatné)
Jindra413
ÚčastníkOmlouvám se za dezinformaci. Udělal jsem to přesně jak píšeš. Ale když to chci opět zprovoznit, tak to stále píše nuly. Ikdyž odpojím čidlo a odpor nechám zapojený.
posjirka
Účastníkchlape obávám se , že tvuj popis nené až tak úplný. Ty jsi totoiž neodpojil pin z DS18B20, ale opojil si zároveň i Pull-up odpor že? To ti totiž udělá přesně to co popisuješ. Celá věda s vyhodonocením chyby na DS18B20 je ta že, když odpojiž pin Arduina od všeho vypíše ti 0,00 st.C. je to proto, že mu nepřijde ani 1 bit log.1.
kaž připojíš čidlo správně máš tam pemanentně log.1 a čidlo přes otevřený kolektor přizemńuje celou linku (log.0) počet log.0/log.1 ti vlastně dává výslednou teplotu. To je vpříkald kladných teplot. Záporné teploty fungují tak, že čidlo zvládne max. 126 st.C a cokoliv je nad je vlastně záporná teplota. Takže data 130 st.C = skutečně -4st.C. To vše končí v -127stC což je úplně mimo roszah čidla (max. -50st.C) a to je vlastně ona hláška „Error“. Když necháš pull-up odpor připojený bez čidla, dostane arduino samé log.1 takže b11111111 což v překladu do dec.soustavy = 255 a při převodu do zápodných hodnot = -127st.C.To jsem se rozepsal. No ve výsledku: odpoji čidlo ale pull-up odpor tam nech a vše bude v pořádku.
Jindra413
ÚčastníkNic se mi na sériovou linku nevypíše.
Pro vypisování na sériovou linku jsem používal toto:
#include <OneWire.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_LibraryOneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)
void setup(void) {
Serial.begin(9600);
}void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;if ( !ds.search(addr)) {
Serial.println(„No more addresses.“);
Serial.println();
ds.reset_search();
delay(250);
return;
}Serial.print(„ROM =“);
for( i = 0; i < 8; i++) {
Serial.write(‚ ‚);
Serial.print(addr[i], HEX);
}if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println(„CRC is not valid!“);
return;
}
Serial.println();// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
Serial.println(“ Chip = DS18S20″); // or old DS1820
type_s = 1;
break;
case 0x28:
Serial.println(“ Chip = DS18B20″);
type_s = 0;
break;
case 0x22:
Serial.println(“ Chip = DS1822″);
type_s = 0;
break;
default:
Serial.println(„Device is not a DS18x20 family device.“);
return;
}ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the enddelay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read ScratchpadSerial.print(“ Data = „);
Serial.print(present, HEX);
Serial.print(“ „);
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
Serial.print(data[i], HEX);
Serial.print(“ „);
}
Serial.print(“ CRC=“);
Serial.print(OneWire::crc8(data, 8), HEX);
Serial.println();// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an „int16_t“ type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// „count remain“ gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 – data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let’s zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(“ Temperature = „);
Serial.print(celsius);
Serial.print(“ Celsius, „);
Serial.print(fahrenheit);
Serial.println(“ Fahrenheit“);
}Zbyšek Voda
ÚčastníkA když pod
lcd.print(tempC);
přidáte
Serial.println(tempC);
Co se Vám po sériové lince vypíše?
Jindra413
ÚčastníkTen kód je převzatý, malinko upravený. Pokud to bude fungovat, měl by to být termostat, který bude zapínat či vypínat podle nastavené teploty.
// This Arduino sketch reads DS18B20 „1-Wire“ digital
// temperature sensors.
// Tutorial:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-tutorial.html#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Data wire is plugged into pin 8 on the Arduino
#define ONE_WIRE_BUS 8// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.htmlDeviceAddress Thermometer = { 0x28, 0xFF, 0xC9, 0x09, 0xA5, 0x15, 0x01, 0x84 };
void setup(void)
{
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(Thermometer, 10);lcd.begin(16,2); // columns, rows. use 16,2 for a 16×2 LCD, etc.
lcd.clear(); // start with a blank screen}
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print(„Error“);
} else {
lcd.print(tempC);}
}void loop(void)
{sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print(„Teplota: „);
printTemperature(Thermometer);
lcd.print(“ C“);int teplota = 23.00;
if (sensors.getTempC(Thermometer)>= teplota)
{ digitalWrite(13, HIGH);
}
else
{ digitalWrite(13, LOW);
}
delay(5000);
}Zbyšek Voda
ÚčastníkDobrý den, zkuste nám prosím pro jistotu poslat kód 🙂
posjirka
Účastník1. obávám se , že takto ti nikdo nepomůže.
Je zvláštní , že to musím psát v každém vlákně, ale BEZ KODU TO PROSTĚ NEJDE.
dej sem kod a můžeme ti poradit jak třeba ušetřit pár bytů.
Ani ti pak nemůžeme poradit co ti nefunguje když nevíme CO VLASTNĚ DĚLÁŠ.
Ušetření místa v SRAM se dá obecně docílit tím, že např:
– nahradíš neměnné promenné (číslo pinu ledky apod) za konstanty
– né všechny proměnné budou tyu integer ale máme třeba boolean, byte atd.
záměnnou integer za byte ušetříš 1 byte (samozřejmě pokud potřebuješ hodnoty 0-255).
– použitím funkcí a metod nemusíš některé kusy programu opakovat.2.Výsledný kod v assembleru najdeš tak, že si nastavíš:
File – Preferences – Show verbose output during zatrhneš compilation.
Tím se ti bude vypisovat průběh kompilace. Když se podíváš do výpisu tak jsou tam soubory *.eep a *.elf to jsou ty co hledáš.posjirka
ÚčastníkTady vidím problém … jak mu řeknu, že jdu ze „2“ na „3“ a né na „1“, když je to ten samý směr?
N 2 4
\ / \ / \
1 3 5tak jednoduše to asi nepůjde. Napadají mě 2 varianty:
1, je třeba ještě dodatečná informace o směru (3-tí kontakt)
2, využít jiného způsobu třebas i nepřímého měření jako třeba měření otáček motoru vs otáčky kola a podel poměru +/- vypočítat jaký byl použit převod. Ovšem fungovalo by to pouze za jízdy. Nevím motory a převodovky jsou pro mě věcí neznámou. Jsem spíš na elektro…pepa48
ÚčastníkAno chápete to dobře jen je tady malý problém.
Jde to N –> dolů –> 1 –> nahoru 2 –> ….. nahoru –> 5 (a zpátky opačně)
takže to není normální sčítání a odčítání nahoru a dolů..
posjirka
ÚčastníkTakže jestli to chápu dobře:
pojmenujemme si LED diody od „0“ kdy „0“ = N, „1“ = 1, … „5“ = 5
Po startu se rozsvítí LED0 a níž to nepůjde
tlačítky „+“ a „-“ chceš posouvat LED nahoru/dolu až po LED5.
Ta bude poslední a dál to nepůjde.
Chápu to dobře?Je třeba si ještě uvědomit, že reakce na stisk tlačítka nemusí být ta správná cesta.
Na tlačítku jsou při stisku zákmity a může se stát, že při stisku může tlačítko „vygenerovat“ řadu impulzů.
Řesší se to time-out-em, kdy po stisku mikročip nereaguje po nastavenou dobu a pak zase čeká.
Je třeba citlivě a z rozmyslem nastavit pak tento čas, protože při rychlém přepnutí nebude reagovat.posjirka
ÚčastníkPředpokládám, že :
G je GND neboli zem
+ je kladný potenciál napájecího napětí (v tomto případe asi 3,3V)
S je zkratka pro signal.Stačilo by si vzít multimetr a bylo by jasno …
Leo
ÚčastníkZdravím.
Potřebovali bychom senzory s meteostanice WH1080 – WH1090 připojít přimo k arduinu.
http://www.hadex.cz/t110-vnejsi-mechanicke-dily-k-meteo-wh1080-a-wh1090/
Neřešíl to už někdo?
Děkují.Zbyšek Voda
ÚčastníkDobrý den, moc nerozumím vaší otázce. Zkuste ji prosím formulovat trochu jinak, děkuji.
barak
ÚčastníkObjednal jsem toto. Prijde do tri dnu.
http://rlx.sk/sk/breakout-boards-accessories-cables/2364-rboard-itead-im120618001-arduino-board-4ch-isolated-relays-xbee-atmega328.htmlbarak
ÚčastníkMozna od temy ale take podminka IF.
Chtel jsem pouzit IF. Sledoval jsem hodnotu y AO a potom dal IF, ale zacyklovalo se, stale cetlo posledni hodnotu. Taj sem to vyresil nize. Da se to vyresit aby se necyklovaloconst int lamdaSig = A0; // Analogový vstup je nastaven na pi A0 pre lambdu sondu
int napatie = 0; // Proměná pro hodnotu přečtenou z A0
int led2 = 2;
int led3 = 3;
int led12=12;
const int sensorPin = A1;
const float baseLineTemp = 20;
int t;void setup() {
// Nastaví rychlost komunika na sériovám portu na 9600 bps:
Serial.begin(9600);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led12, OUTPUT);
}void loop() {
int sensorVal = analogRead(sensorPin);
napatie = analogRead(lamdaSig); // přečte hodnotu z A0 z lambda sondy
napatie = ((napatie * 500.0) / 0.1) / 1024; //vysledok v mV
// aby jsme videli vysledek, hodnotu odešleme přes sériový port
Serial.print(“ napatie = “ ); // zapiše text hodnota =
Serial.println(napatie); // zapiše proměnou hodnotu/napatiefloat teplota = ((sensorVal*5000.0)/30) /1024;
Serial.print(“ teplota = „);Serial.println(teplota);
delay(1000); // čekej 1000mst=constrain(teplota, 20, 200); //ked je teplota mensi ako nastavene tak vrati 25,
Serial.print(„upravene = „);
Serial.println(t);switch(t){
case 20:
digitalWrite(led12, HIGH); //blika ked nie je teplota
delay(1000);
digitalWrite(led12, LOW);
digitalWrite(led3,HIGH); //teplota mensi nez pozadovana otvari sa klapka1
break;default: //ked je teplota v roymeyi nastavene par contrain
digitalWrite(led3, LOW); //zatvori klapku1
if (napatie < 200) { //mensi tak otvara klapku
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led2, LOW); //klapka sa otvara len urcity cas pak zatvori
}if (napatie > 200) { //vetsi zatvara klapku
digitalWrite(led2, LOW);
}if (napatie > 500) { //vetsi zatvara klapku
digitalWrite(led3, HIGH);
delay(500);
digitalWrite(led3, LOW); //cas delay otvorena klapka pak zatvori
}
if (napatie < 500) {
digitalWrite(led3, LOW);
}delay(1000); //nacha reagovat po delay pak nove meranie
break;
}
m.myska
ÚčastníkOpravdu mi chodí v serial monitoru svítí 🙂 , ale to je asi fuk.
Kde a jak tedy položit podmínku k výpisu, aby reagovala po stavu HIGH i LOW?
Díky. -
AutorPříspěvky