Píseň z pohádky Tři oříšky pro popelku
Hned po nahrání kódu piezo připojené k arduinu začne hrát píseň.
Je zvolena metoda měření úbytku napětí na odporu při napájení konstantním proudem. Zdroj proudu je realizovaný pomocí LM334. Napětí měříme modulem HX711. Pomocí pár součástek získáme jednoduchý, levný (asi 100 Kč) a přesný převodník pro Pt100.
Zdroj konstantního proudu vychází ze zapojení v datasheetu. Tam nalezneme vše potřebné pro případnou úpravu zapojení. Při hodnotách R1,R2 teče proud 168 µA. Zdroj proudu je napájený 5V.
U modulu HX711 jsou použity vstupy A a B. Napájení E+,E- není použito. Výstup je propojený se vstupy A0 a A1 modulu Arduino. Kanál B slouží pro měření proudu. Můžeme tak sledovat teplotní a časovou závislost zdroje proudu. Případný rozdíl mezi hodnotou uloženou při nastavení převodníku a hodnotou aktuální lze využít pro posun rozsahu. Kanál A používá zesílení 64 a měří úbytek napětí na Pt100. Tato hodnota je v programu převedena na ohmy a následně na teplotu. Na kanálu A při zesílení 64 lze měřit do 370 °C (238Ω * 168 µA = 0,0399mV).
K nastavení a testování slouží jednoduchý program. Nastavení pro rozsah 0 - 211°C provedeme pomocí odporu 100 Ω a 180 Ω(přesnost 0,1%). Při 100Ω zapíšeme konstanty proud a spodni. Při 180Ω konstantu horni. Hodnota privod je trvalý rozdíl mezi měřením Pt100 a senzorem DS18B20(při nastavení privod = 0).
Potřebná knihovna HX711 je ke stažení zde, návod pro její importování zde.
#include "HX711.h" #include <OneWire.h> #include <DallasTemperature.h> #include <Nokia5110.h> // nastavení čísla vstupního pinu const int pinCidlaDS = 2; // vytvoření instance oneWireDS z knihovny OneWire OneWire oneWireDS(pinCidlaDS); // vytvoření instance senzoryDS z knihovny DallasTemperature DallasTemperature senzoryDS(&oneWireDS); HX711 scale; #define Ka 0.0039083 #define Kb -5.775E-07 #define proud 1679.5 //hodnota vst. B pri nastaveni #define spodni 3346.0 //hodnota vst. A pri 100 Ohmech #define horni 6016.0 //hodnota vst. A pri 180 Ohmech #define privod 0.4 //kompenzace privodu // nastavení propojovacích pinů #define RST 10 #define CE 9 #define DC 8 #define DIN 7 #define CLK 6 // inicializace LCD displeje z knihovny LCDnokia5110 lcd(RST, CE, DC, DIN, CLK); String zapis = ""; char tisk[10]; float spodni_a; float horni_a; void setup() { // zahájení komunikace s displejem lcd.LcdInitialise(); // vymazání obsahu displeje lcd.LcdClear(); // nastavení velikosti mezery mezi písmeny, // lze nastavit na 0, 1 či 2 body lcd.CharSpace = 1; lcd.GotoXY(20,0); lcd.LcdString("start"); senzoryDS.begin(); // parameter "gain" is ommited; the default value 128 is used by the library // HX711.DOUT - pin #A1 // HX711.PD_SCK - pin #A0 scale.begin(A1, A0,32); delay(2000); //zahrati systemu float z = scale.read_average(20); scale.set_gain(64); z = scale.read_average(20); } void loop() { //***** teplota DS18B20 ********************************************* senzoryDS.requestTemperatures(); float teplota_DS = senzoryDS.getTempCByIndex(0); //***** cteni proudu ************************************************ scale.set_gain(32); float proud_a = scale.read_average(3)/1000.0; //omezeni na 1 des. misto o hodnote 0 nebo 0.5 int prumer = int(proud_a); float zbytek = proud_a - float(prumer); if (zbytek < 0.5){ proud_a = float(prumer); } else { proud_a = float(prumer) + 0.5; } float podil = proud_a / proud; //***** cteni odporu *********************************************** scale.set_gain(64); //uprava zacatku rozsahu podle zmeny proudu spodni_a = spodni * podil; //uprava konce rozsahu podle zmeny proudu horni_a = horni * podil; //omezeni des. míst prumer = int(scale.read_average(3)/1000.0); float x =float(prumer); //prepocet na odpor 100 - 180 ohmu float odpor = (x - spodni_a) * (180.0 - 100.0) / (horni_a - spodni_a) + 100.0 ; //prepocet na teplotu 0 - 211 st. float teplota = (( sqrt(Kb * odpor - 100.0 * Kb + 25.0 * pow(Ka,2)) - 5.0 * Ka) / (10.0 * Kb)) - privod; //***** zapis hodnot ************************************************* //mereni proudu vstup B lcd.GotoXY(20,0); zapis = String(proud_a,DEC); zapis.toCharArray(tisk, 8); lcd.LcdString(tisk); //mereni Pt100 vstup A lcd.GotoXY(20,1); zapis = String(x,DEC); zapis.toCharArray(tisk, 8); lcd.LcdString(tisk); //prepocet na odpor lcd.GotoXY(20,2); zapis = String(odpor,DEC); zapis.toCharArray(tisk, 8); lcd.LcdString(tisk); //prepocet na teplotu lcd.GotoXY(20,3); zapis = String(teplota,DEC); zapis.toCharArray(tisk, 8); lcd.LcdString(tisk); //teplota DS18B20 lcd.GotoXY(20,4); zapis = String(teplota_DS,DEC); zapis.toCharArray(tisk, 8); lcd.LcdString(tisk); delay(5000); }
Seznam použitých komponent:
http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
http://dratek.cz/arduino/998-arduino-ad-prevodnik-24-bit-2-kanaly-hx711-1427807780.html
Hned po nahrání kódu piezo připojené k arduinu začne hrát píseň.
Cílem projektu je navrhnout a sestavit obvod s krokovým motorem, který umožní řízení jeho rychlosti pomocí potenciometru. Tato technologie bude využitelná například při výrobě filamentu z PET lahví pro 3D tisk. Projekt zahrnuje výběr vhodného motoru, ovladače, potenciometru a mikrokontroléru, které budou propojeny a naprogramovány pro optimální funkci.