Blink without delay voor stappenmotor

Arduino specifieke Software
Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Blink without delay voor stappenmotor

Berichtdoor shooter » 27 Nov 2018, 22:17

en nu nog splitsen in modules (functies)
dan krijg je in de loop een paar simpele aanroepen als er een tijd voorbij is.
if (tijdtemperatuur) {haal temperatuur}
if (rotatietijd||rotatiebezig){doe een stap}
if displaytijd){ververs display}
paul deelen
shooter@home.nl

Advertisement

Berichten: 12
Geregistreerd: 29 Sep 2018, 11:35

Re: Blink without delay voor stappenmotor

Berichtdoor Bertje46 » 27 Nov 2018, 23:26

Hi Koepel,

cpp code
Is het goed als ik ze allemaal noem ? (je mag meteen doorscrollen naar de laatste alinea).

Haha, nee hoor, ik neem je advies graag ter harte :D en ben blij dat je zoveel moeite neemt om mij te helpen!

Zodra ik weer zover ben kom ik terug ;)


cpp code
en nu nog splitsen in modules (functies)
Zal eerst de opmerkingen - adviezen van Koepel proberen te gebruiken zodat de code goed werkt en dan is de volgende stap het splitsen in modules.

mmm,.... ik zie wel dat de opmerkingen hier allemaal scheef staan terwijl ze in de editor wel recht onder elkaar staan. :o

Bert

Berichten: 12
Geregistreerd: 29 Sep 2018, 11:35

Re: Blink without delay voor stappenmotor

Berichtdoor Bertje46 » 09 Jan 2019, 22:46

Hallo,

Met wat tussenpozen heb ik nog aan de code gewerkt en uitgetest met de tips van Koepel.
Voor mij werkt hij momenteel prima maar er zullen best nog wel wat schoonheidsfoutjes inzitten of andere mogelijkheden zijn.

Deze code draait nu al ruim een week aan een stuk zonder problemen op een Arduino Nano en een DS18B20 temperatuur sensor icm een stappenmotor en 3 waarschuwing-ledjes in de broedmachine.
Ook heb ik de code gesplitst in verschillende functies, zoals Shooter aangaf, waar je in de loop een keuze kan maken voor welke vogelsoort het bedoeld is, dit ivm verschillende temperaturen voor elk soort.

Om te experimenteren ben ik ook bezig geweest om de standaard lcd te vervangen voor een kleuren tft-lcd icm een arduino mega 2562, als je deze wilt gebruiken moet de code worden aangepast. Dit bied meer mogelijkheden en de waarschuwing ledjes zijn niet meer nodig!

De verwarming wordt door een aparte thermostaat geregeld en dus niet door de arduino.

In het kort;
Het is bedoelt als controller in een broedmachine maar kan ook voor andere doeleinden gebruikt worden.
Temperatuur in de kast wordt continu uitgelezen door een gekalibreerde DS18B20 sensor, dit geeft hij weer op het lcd scherm. De ledjes zijn van een grote afstand te zien, dus bij te warm of te koud zie je in een oogopslag of er iets aan de hand is. De stappenmotor draait om de 6 uur de vooraf ingestelde aantal stappen wat de eieren doet kantelen en geeft dit ook weer op het lcd scherm. En er telt een counter tot 6 uur zodat je kan zien wanneer de eieren weer gaan draaien en dan weer bij nul begint.

cpp code
Broedmachine controller
Bert van de K
Board Arduino uno of nano met lcd 16x2 OF
Board Arduino Mega 2562 met 480x320 ILI9486 lcd-tft scherm
Enable of Disable welke lcd of tft gebruikt wordt
Temperatuur sensor = 18DB20

//Libraries
#include "OneWire.h"
#include "DallasTemperature.h"

//DS18B20 Pin A0
#define ONE_WIRE_BUS A0

// Benodigd voor 1 draads DS18B20
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

/**********Kies hier het juiste LCD-scherm*************/
//LCD display 2x16 met I2C
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C lcd(0x27, 16, 2);

// OF

//TFT-LCD scherm
//#include <UTFT.h>
/**************************************************/

// Model en parameters lcd-kleuren-TFT module voor Mega-2560!
//UTFT myGLCD(ILI9486, 38, 39, 40, 41);

// Declare welke fonts we gebruiken
// Alleen icm TFT scherm
/*
extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t arial_italic[];
extern uint8_t arial_bold[];
*/
//****************************

// Led Pins
const int BlauweLedPin = 4;
const int GroeneLedPin = 5;
const int RodeLedPin = 6;

// EasyDriver Pins
const int DirectionPin = 2;
const int StepPin = 3;
const int EnablePin = 7;

// DirectionSate stepper
int DirectionState = LOW;

// Tel elke kanteling eierrek
int stepCount = 0;

// Tijdsaanduiding uren, minuten en seconden
int hours, minutes, secondes;

// Timer voor stappenmotor
char timeline[16];

// Temperatuur meting zonder delay
unsigned long previousMillisTemp = 0;
const unsigned long intervalTemp = 1000;

// Counter zonder delay
unsigned long previousMillisCount = 0;
const unsigned long intervalCount = 1000;

// Steppermotor zonder delay
// Telt 6 uur tot stepper een stap verder is
unsigned long previousMillisStepperMotor = 0;
const unsigned long intervalStepperMotor = 6000UL * 3600UL;
// 6 hour, "UL" means "unsigned long"
// Tijd die de stepper wacht om verder te gaan.


// Calibratie temperatuursensor om eventuele afwijkingen te compenseren
//https://www.instructables.com/id/Calibration-of-DS18B20-Sensor-With-Arduino-UNO/
float RawValue = 0.0;
float RawHigh = 100; //Hoogste temperatuur kokend water
float RawLow = 0.5; //Laagste temperatuur ijswater
float ReferenceHigh = 100.0;
float ReferenceLow = 0.0;
float RawRange = RawHigh - RawLow;
float ReferenceRange = ReferenceHigh - ReferenceLow;


void setup(void) {

//Zet de digitale pins als output
//voor de Easy Driver
pinMode(DirectionPin, OUTPUT);
pinMode(StepPin, OUTPUT);
pinMode(EnablePin, OUTPUT);
digitalWrite(EnablePin, HIGH);

//Verwijder // bij gebruik van ledjes en Nano
pinMode(BlauweLedPin, OUTPUT);
pinMode(GroeneLedPin, OUTPUT);
pinMode(RodeLedPin, OUTPUT);


//Kies hier welk scherm

// LCD 16*2
lcd.begin();

// Zet vaste tekst op lcd 16*2
lcd.setCursor (9, 1);
lcd.print("Omw.");
lcd.setCursor (14, 0);
lcd.print("C");
lcd.print((char)223);


// LCD-TFT
//myGLCD.InitLCD(1);
//myGLCD.setFont(arial_italic);

// Zet vaste tekst op LCD-TFT
//myGLCD.clrScr();

//myGLCD.setColor(255, 0, 0);
//myGLCD.fillRect(0, 0, 479, 20);
//myGLCD.setColor(64, 64, 64);
//myGLCD.fillRect(0, 320, 479, 296);
//myGLCD.setColor(255, 255, 255);
//myGLCD.setBackColor(255, 0, 0);
//myGLCD.setFont(arial_italic);
//myGLCD.print("* Broedmachine Controler *", CENTER, 1);
//myGLCD.setBackColor(64, 64, 64);
//myGLCD.setColor(255, 255, 0);
//myGLCD.setColor(0, 0, 255);
//myGLCD.drawRect(0, 21, 479, 295);

//******************************************************************************
//myGLCD.drawLine (119,119,150,280); //x1,y1,x2,y2 maak een lijn van x naar y
//myGLCD.setBackColor(64, 64, 64);
//myGLCD.setColor(255, 255, 0);
//myGLCD.setFont(arial_bold);

//Start sensors
sensors.begin();
sensors.setResolution(11);


}

void loop(void) {
DisplayTijd();
DisplayTemperatuur();
Rotatietijd();

/*********************************************************************
Kies hier een vogelsoort voor de juiste temperatuur instellingen
**********************************************************************/
//LedjesKwartel();
LedjesKip();
//LedjesAmazone();
/*********************************************************************/

}


void DisplayTijd(void) {

//Geeft aan hoeveel tijd nog tot eierrek kantelt
//Start elk uur opnieuw

unsigned long currentMillis = millis(); // deze is maar 1 x nodig
if (currentMillis - previousMillisCount >= intervalCount)
{
previousMillisCount += intervalCount;

//Enable of Disable lcd of tft scherm
//Kies hier onder voor LCD 16*2 of LCD-kleurenTFT

//lcd 16*2
lcd.setCursor(0, 1);
sprintf(timeline, "%01d:%02d:%02d", hours, minutes, secondes);
lcd.print(timeline);

//lcd-tft
//sprintf(timeline, "%02d:%02d ", minutes, secondes);
//myGLCD.setFont(BigFont);
//myGLCD.setBackColor(0);
//myGLCD.print("Draait over:", 5, 25);
//myGLCD.setFont(arial_italic);
//myGLCD.print(timeline, 225, 25);


secondes++;

if (secondes >= 60)
{
secondes = 0;
minutes ++;
}
if (minutes >= 60)
{
minutes = 0;
hours ++;
}
if (hours >= 6)
{
hours = 0;

}
}

}

void DisplayTemperatuur(void) {

//Temperatuur LCD-SCHERM GEKALIBREERD**TEMP Without DELAY

unsigned long currentMillis = millis(); // deze is maar 1 x nodig

if (currentMillis - previousMillisTemp >= intervalTemp) {
previousMillisTemp = currentMillis;

sensors.requestTemperatures(); // Send the command to get temperature readings
float RawValue = sensors.getTempCByIndex(0);
float CorrectedValue = (((RawValue - RawLow) * ReferenceRange) / RawRange) + ReferenceLow;

//Kies hier onder voor LCD 16*2 of LCD-kleurenTFT

//LCD 16*2
lcd.setCursor(10, 0);
lcd.print(CorrectedValue, 1);

//lcd-tft
//myGLCD.setBackColor(0);
//myGLCD.setFont(BigFont);
//myGLCD.print("Temperatuur is:", 5, 45);
//myGLCD.setFont(arial_italic);
//myGLCD.printNumF(CorrectedValue, 2, 270, 45);
}
}
void LedjesKwartel(void) {

//Aansturing Waarschuwings Ledjes bestemd voor kwartel
// Indien kouder dan 37,6 graden dan blauwe led,
// wanneer warmer dan 37,8 dan rode led,
// binnen de aangegeven zone dan groene led.

sensors.requestTemperatures(); // Send the command to get temperature readings
float RawValue = sensors.getTempCByIndex(0);
float CorrectedValue = (((RawValue - RawLow) * ReferenceRange) / RawRange) + ReferenceLow;


if ( CorrectedValue < 37.6 )
{
//myGLCD.setColor(VGA_BLUE);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(GroeneLedPin, LOW);
digitalWrite(RodeLedPin, LOW);
digitalWrite(BlauweLedPin, HIGH);
}
else if ( CorrectedValue > 37.8)
{
//myGLCD.setColor(VGA_RED);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(GroeneLedPin, LOW);
digitalWrite(BlauweLedPin, LOW);
digitalWrite(RodeLedPin, HIGH);
}
else
{
//myGLCD.setColor(VGA_LIME);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(BlauweLedPin, LOW);
digitalWrite(RodeLedPin, LOW);
digitalWrite(GroeneLedPin, HIGH);
}
//Kies hier onder voor LCD 16*2 of LCD-kleurenTFT

//lcd 16*2
lcd.setCursor(0, 0);
lcd.print("Kwartel ");

//lcd-kleuren tft
//myGLCD.setBackColor(64, 64, 64);
//myGLCD.setColor(255, 255, 255);
//myGLCD.setFont(arial_bold);
//myGLCD.print("<ingesteld voor Kwartel>", CENTER, 297);
}

void LedjesKip(void) {

//Aansturing Waarschuwings Ledjes bestemd voor kip
// Indien kouder dan 37.4 graden dan blauwe led,
// wanneer warmer dan 37,6 dan rode led,
// binnen de aangegeven zone dan groene led.

sensors.requestTemperatures(); // Send the command to get temperature readings
float RawValue = sensors.getTempCByIndex(0);
float CorrectedValue = (((RawValue - RawLow) * ReferenceRange) / RawRange) + ReferenceLow;


if ( CorrectedValue < 37.40 )
{
//myGLCD.setColor(VGA_BLUE);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(GroeneLedPin, LOW);
digitalWrite(RodeLedPin, LOW);
digitalWrite(BlauweLedPin, HIGH);
}
else if ( CorrectedValue > 37.60)
{
//myGLCD.setColor(VGA_RED);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(GroeneLedPin, LOW);
digitalWrite(BlauweLedPin, LOW);
digitalWrite(RodeLedPin, HIGH);
}
else
{
//myGLCD.setColor(VGA_LIME);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(BlauweLedPin, LOW);
digitalWrite(RodeLedPin, LOW);
digitalWrite(GroeneLedPin, HIGH);
}

//Kies hier onder voor LCD 16*2 of LCD-kleurenTFT

//lcd 16*2
lcd.setCursor(0, 0);
lcd.print("Kip ");

//lcd-kleuren tft
//myGLCD.setBackColor(64, 64, 64);
//myGLCD.setColor(255, 255, 0);
//myGLCD.setFont(arial_bold);
//myGLCD.print("<-Kippen->", CENTER, 297);
}

void LedjesAmazone(void) {

//Aansturing Waarschuwings Ledjes bestemd voor Amazone papegaaien
// Indien kouder dan 36.8 graden dan blauwe led,
// wanneer warmer dan 37 dan rode led,
// binnen de aangegeven zone dan groene led.

sensors.requestTemperatures(); // Send the command to get temperature readings
float RawValue = sensors.getTempCByIndex(0);
float CorrectedValue = (((RawValue - RawLow) * ReferenceRange) / RawRange) + ReferenceLow;

if ( CorrectedValue < 36.8 )
{
//myGLCD.setColor(VGA_BLUE);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(GroeneLedPin, LOW);
digitalWrite(RodeLedPin, LOW);
digitalWrite(BlauweLedPin, HIGH);
}
else if ( CorrectedValue > 37.00)
{
//myGLCD.setColor(VGA_RED);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(GroeneLedPin, LOW);
digitalWrite(BlauweLedPin, LOW);
digitalWrite(RodeLedPin, HIGH);
}
else
{
//myGLCD.setColor(VGA_LIME);
//myGLCD.fillCircle(250, 150, 50);
digitalWrite(BlauweLedPin, LOW);
digitalWrite(RodeLedPin, LOW);
digitalWrite(GroeneLedPin, HIGH);
}
//Kies hier onder voor LCD 16*2 of LCD-kleurenTFT

//lcd 16*2
lcd.setCursor(0, 0);
lcd.print("Amazone ");

//lcd-kleuren tft
//myGLCD.setBackColor(64, 64, 64);
//myGLCD.setColor(255, 255, 0);
//myGLCD.setFont(arial_bold);
//myGLCD.print("< Amazone Papegaai >", CENTER, 297);
}

void Rotatietijd(void) {

//STARTS STEPPER CODE

unsigned long currentMillis = millis();
if (currentMillis - previousMillisStepperMotor >= intervalStepperMotor) {
previousMillisStepperMotor = currentMillis;

//Verander hier eventueel het aantal stappen en snelheid
rotate(380, 0.1);

//De Motor draait 380 stapen clockwise en
//counterclockwise met een snelheid van 0.1 van 1

digitalWrite(EnablePin, HIGH);
digitalWrite(DirectionPin, DirectionState);

// Tel bij iedere kanteling eierrek steeds +1
stepCount ++;

//Kies hier onder voor LCD 16*2 of LCD-kleurenTFT

//LCD 16*2
lcd.setCursor (13, 1);
lcd.print(stepCount);

//LCD-TFT
//myGLCD.setBackColor(0);
//myGLCD.setFont(arial_bold);
//myGLCD.print("Gedraaid:", 5, 65);
//myGLCD.print("X", 250, 65);
//myGLCD.setFont(arial_italic);
//myGLCD.printNumI(stepCount, 185, 65);

}
}

void rotate(int steps, float speed) {

//Schakelt de motor in,
//zodat deze beweegt wanneer
//daarom wordt gevraagd.
digitalWrite(EnablePin, LOW);

if (steps > 0) {}

if (DirectionState == LOW) {
DirectionState = HIGH;
} else {
DirectionState = LOW;
}

//Bepaal hieronder de
//draaisnelheid van de Steppermotor.
speed = 1.0 / speed * 850.0;

//Stores the absolute value of the content in 'steps'
//back into the 'steps' variable
steps = abs(steps);

//Schrijft de richting naar de EasyDriver DIR-pen
digitalWrite(DirectionPin, DirectionState);

for (int i = 0; i < steps; i++) {
digitalWrite(StepPin, HIGH);
delayMicroseconds(speed);
digitalWrite(StepPin, LOW);
delayMicroseconds(speed);
}
//De motor wordt spanningsloos -
//gemaakt tot het moment dat hij weer wordt opgeroepen.
digitalWrite(EnablePin, HIGH);
}


//***
Laatst gewijzigd door Bertje46 op 09 Jan 2019, 23:27, in totaal 1 keer gewijzigd.

Berichten: 12
Geregistreerd: 29 Sep 2018, 11:35

Re: Blink without delay voor stappenmotor

Berichtdoor Bertje46 » 09 Jan 2019, 23:26

Hierbij nog een foto van het kastje!
Bijlagen
image1.jpeg
image1.jpeg (88.57 KiB) 3015 keer bekeken

Vorige

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten