Start impuls 12 volt ventilator

hallo

ik heb deze sketch gebruikt en dit werkt mooi. Alleen zou ik een ding willen toevoegen
dat als de ventilator start op 10% , hij even een korte puls krijgt van 30% om vervolgens weer terug te gaan naar de juiste waarde.

punt is dat een 12 volt ventilator niet gaat draaien bij 10% vermogen wel als die eenmaal draait. hoe zou ik dat kunnen oplossen ?

#define BLYNK_TEMPLATE_ID "xxxxxxxxxx"
#define BLYNK_TEMPLATE_NAME "Fancontroller"

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); 


 
#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS 12


 
int fanPin = 16;
int dutyCycle = 0;
 
float temp = 0;
int threshold = 22;   //   start temp van de ventilator ********************************************************
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
WidgetLED FAN(V0);
 
char auth[] = "Kxxxxxxcccc-j";
char ssid[] = "xxxxxxccccc";
char pass[] = "xxxxxxxccc";
 
 
void setup()
{
  Serial.begin(115200);
  sensors.begin();
  pinMode(fanPin, OUTPUT);
 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("  Temperature ");
  lcd.setCursor(0, 1);
  lcd.print("Monitoring System");
  delay(4000);
  lcd.clear();
 
  analogWriteRange(100);
  analogWriteFreq(10000);
 
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
}
 
 
BLYNK_WRITE(V7)
{
  threshold = param.asInt();
  Serial.print(" The Threshhold thresholdue is: ");
  Serial.println(threshold);
  Serial.println();
}
 
 
void controlFanSpeed(int fanSpeedPercent)
{
  analogWrite(fanPin, fanSpeedPercent);
 
  Serial.print("Fan Speed: ");
  Serial.print(fanSpeedPercent);
  Serial.println("%");
 
  lcd.setCursor(0, 1);
  lcd.print("Fan Speed: ");
  lcd.print(fanSpeedPercent);
  lcd.print("%");

  lcd.setCursor(0, 3);
  lcd.print("");
}
 
 
void loop()
{
  Blynk.run();
  sensors.requestTemperatures();
  temp = sensors.getTempCByIndex(0);
 
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println("*C");
 
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" *C");

  
 
  Blynk.virtualWrite(V3, temp);
 
  if (temp >= threshold)
  {
    FAN.on();
    int fanSpeedPercent = map(temp, threshold, 30, 10, 100); // bij threshold  10% speed     bij 30 graden 100% speed  ***********************
    controlFanSpeed(fanSpeedPercent);
    Blynk.virtualWrite(V4, fanSpeedPercent);
  }
  else if (temp < threshold)
  {
    FAN.off();  
    int fanSpeedPercent = 0;
    controlFanSpeed(fanSpeedPercent);
    Blynk.virtualWrite(V4, fanSpeedPercent);
  }
}

Haal eerst je auth[], SSID[] en pass[] weg uit het geposte. Dit soort zaken deel je nooit. Vervang het door "xxxxx" of wat anders. We weten ook wel dat daar wat anders moet staan en dat dit niks met de vraag te maken heeft.

Zet na FAN.on(); een regel dat de ventilator aan het gewenste percentage start. Zet daar een korte delay achter van bijvoorbeeld 500. Een halve seconde. Een delay wordt normaal afgeraden maar in deze maakt het weinig uit.

Ik ken heel het blynk gegeven niet maar toch enkele bedenkingen.
Je vraagt zowat elke 750ms de temperatuur op. Zo snel wijzigt de temperatuur in een ruimte niet. Je gaat op die manier wel je DS18B20 lichtjes opwarmen. Vraag de temperatuur elke 5 of 10 minuten.

Je hebt nergens een (zichtbare) hysteresis ingebouwd. Bij >22°C springt de ventilator aan en bij < 20°C gaat die weer uit. In de praktijk zal dat dus 22,1°C en 21,9°C zijn. Slechts 0,2°C verschil. Je ventilator gaat rond dat punt dus heel vaak aan en uit gaan. Dat wil je beslist niet. Je hebt een hoogste temperatuur en een laagste temperatuur nodig. Bijvoorbeeld 22 en 21.

UItstekend advies maar........door op het potloodje bovenaan de openingspost te klikken, kun je de edits zien en komt het SSID weer tevoorschijn.

Wellicht dat een mod daar nog wat aan kan doen in dit geval.

Dank voor je bericht en ben idd vergeten weg te halen. Goede nieuws is ....het staat al lang op de TO Do list of deze vervelende wifi code eens te veranderen. Heb nu gelijk een reden om dit te doen :slight_smile: Ik ga alle aanpassing proberen door te voeren en laat het weten hoe de ventilator er op reageert. Dank zo ver.

Als je geen gebruik maakt van wifimanager is het eenvoudigst de "secret" zaken in een .h file te zetten in dezelfde map. Noem dat bestand bijvoorbeeld credentials.h. #include "credentials.h" in je code en je probleem is opgelost.

aha weer wat geleerd..

ik heb er overigens een lusje tussen gezet X++ en dat lijkt te werken.
niet de mooiste oplossing denk ... maar werkt wel

 if (temp >= threshold)
  {
    FAN.on();
    x++;

 if (x <=1) 

      {
      controlFanSpeed(50);  // tijdelijk even naar 50%
      delay(1000);  
      
      }


    int fanSpeedPercent = map(temp, threshold, 30, 10, 100); // bij threshold  10% speed     bij 30 graden 100% speed  ***********************
    controlFanSpeed(fanSpeedPercent);
    Blynk.virtualWrite(V4, fanSpeedPercent);

ps waar kan je zien dat ik om de 750ms de temperatuur op vraagt ?

toch maar even de gehele code


#define BLYNK_TEMPLATE_ID ""
#define BLYNK_TEMPLATE_NAME "Fancontroller"

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); 


 
#define BLYNK_PRINT Serial
#define ONE_WIRE_BUS 12

int x=0;
int y=0;
 
int fanPin = 16;
int dutyCycle = 0;
 
float temp = 0;
int threshold = 22;   //   start temp van de ventilator ********************************************************
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
WidgetLED FAN(V0);
 
char auth[] = "";
char ssid[] = "";
char pass[] = "";
 
 
void setup()
{
  Serial.begin(115200);
  sensors.begin();
  pinMode(fanPin, OUTPUT);
 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("  Temperature ");
  lcd.setCursor(0, 1);
  lcd.print("Monitoring System");
  delay(4000);
  lcd.clear();
 
  analogWriteRange(100);
  analogWriteFreq(10000);
 
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
}
 
 
BLYNK_WRITE(V7)
{
  threshold = param.asInt();
  Serial.print(" The Threshhold thresholdue is: ");
  Serial.println(threshold);
  Serial.println();
}
 
 
void controlFanSpeed(int fanSpeedPercent)
{
  analogWrite(fanPin, fanSpeedPercent);
 
  Serial.print("Fan Speed: ");
  Serial.print(fanSpeedPercent);
  Serial.println("%");
 
  lcd.setCursor(0, 1);
  lcd.print("Fan Speed: ");
  lcd.print(fanSpeedPercent);
  lcd.print("%");

  
}
 
 
void loop()
 
{

 delay(1000);

  Blynk.run();
  sensors.requestTemperatures();
  temp = sensors.getTempCByIndex(0);
 
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println("*C");
 
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" *C");

  lcd.setCursor(0, 3);
  lcd.print(x);


 
  Blynk.virtualWrite(V3, temp);
 
  if (temp >= threshold)
  {
    FAN.on();
    x++;

       if (x <=1) {
      controlFanSpeed(50);  // tijdelijk even naar 50%
      delay(2000);  
      }


    int fanSpeedPercent = map(temp, threshold, 30, 10, 100); // bij threshold  10% speed     bij 30 graden 100% speed  ***********************
    controlFanSpeed(fanSpeedPercent);
    Blynk.virtualWrite(V4, fanSpeedPercent);
  }
  else if (temp < threshold)
  {
    FAN.off();  
    lcd.setCursor(1, 3);
    lcd.print("    ");
    x=0;
    int fanSpeedPercent = 0;
    controlFanSpeed(fanSpeedPercent);
    Blynk.virtualWrite(V4, fanSpeedPercent);
  }
}

buckfast_beekeeper schreef: In de praktijk zal dat dus 22,1°C en 21,9°C zijn. Slechts 0,2°C verschil.

Fout. 22,1 resp. 19,9, dat is 2,2°C verschil.

Je gebruikt de standaard 12 bits resolutie van de DS18B20. In de datasheet op blz 3 staat de benodigde conversietijd.

Je gebruikt ook de standaard setup van de library. Wat gebeurd er dan?
Uit de library code

waitForConversion = true;
	

Wat verder in de code

// sends command for all devices on the bus to perform a temperature conversion
void DallasTemperature::requestTemperatures() {

	_wire->reset();
	_wire->skip();
	_wire->write(STARTCONVO, parasite);

	// ASYNC mode?
	if (!waitForConversion)
		return;
	blockTillConversionComplete(bitResolution);

}

Met blockTillConversionComplete(bitResolution); als functie. bitResolution is dus standaard 12.

t// Continue to check if the IC has responded with a temperature
void DallasTemperature::blockTillConversionComplete(uint8_t bitResolution) {

  if (checkForConversion && !parasite) {
    unsigned long start = millis();
    while (!isConversionComplete() && (millis() - start < MAX_CONVERSION_TIMEOUT ))
      yield();
  } else {
    unsigned long delms = millisToWaitForConversion(bitResolution);
    activateExternalPullup();
    delay(delms);
    deactivateExternalPullup();
  }

}

// returns number of milliseconds to wait till conversion is complete (based on IC datasheet)
int16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution) {

	switch (bitResolution) {
	case 9:
		return 94;
	case 10:
		return 188;
	case 11:
		return 375;
	default:
		return 750;
	}

}

In int16_t DallasTemperature::millisToWaitForConversion(uint8_t bitResolution) komen de tijden terug die in de datasheet staan.
In

    unsigned long delms = millisToWaitForConversion(bitResolution);
    activateExternalPullup();
    delay(delms);
    deactivateExternalPullup();

Wordt het delay effectief gebruikt.

De rest van je code neemt weinig tijd in beslag. Zonder extra delay zal je in iets meer dan 750ms terug een waarde opvragen. Je kan dit testen door net voor Blynk.run()

uint32_t beginTijd = millis();

te zetten en net voor je laatste }

uint32_t eindTijd = millis();
Serial.print("tijd nodig: ");
Serial.print(eindTijd - beginTijd);
Serial.println("ms");

Even alle overige delay in commentaar zetten.

Hoe zorg je er voor dat de DS18B20 je programma niet vertraagt?

sensors.setWaitForConversion(false);

Je moet dan wel zelf bijhouden hoeveel tijd er is tussen je conversievraag (
sensors.requestTemperatures(); ) en het uitlezen van de temperatuur. Minimaal moet dat dus de conversietijd zijn.

// zorgen dat het programma blijft lopen terwijl de temperaturen worden bepaald
// elke 5 seconden een nieuwe temperatuur
const uint32_t temperatuurIntervalMillis = 5000;
uint32_t previousTemperatuurMillis = 0;

// in je loop volgende code
if (previousTemperatuurMillis + temperatuurIntervalMillis <= millis()) {      
    previousTemperatuurMillis = millis();      
    sensors.getTempCByIndex(0);
    sensors.requestTemperatures();
}

In wezen is je uitgelezen waarde hier dus ongeveer 5 seconden oud.

Waar vind je de 20°C in de origineel gegeven code? Staat volgens mij alleen

int threshold = 22; //   start temp van de ventilator

Als je dan in de code > gebruikt is dat 22,1 en < is dan 21,9.

Uiteraard kan ik het fout hebben maar dan graag wat ik niet heb begrepen of gezien. Ik leer elke dag graag bij.

Dat is wat buckfast_beekeeper schreef.

Phoe erg ingewikkeld ......maar kan toch ook een delay 500 zetten in void loop() ?
minder mooi waarschijnlijk :see_no_evil:

kan wel bevestigen dat de ventilator gaat draaien bij 22,0 en uitgaat bij 21,9 dus idd geen hysterese. Suggesties ?

agrrr code / schema is toch niet helemaal juist denk. Gaat wel goed op de serial monitor maar de fan gaat helaas niet draaien.
Maar hoe kan een digitale uitgang van 3,3 volt een 12 volt fan aansturen. De mosfet gaat toch niet in geleiding ? zie schema

ik gebruikt de mosfet irf 540 zou de drempel waarde van 3 volt te laag zijn ?
op 5 volt gelijkspanning aan de gate werkt de mosfet wel

Het is altijd goed om voor je iets gaat ontwerpen, de dataheet (klik !) van jouw te gebruiken onderdelen op te zoeken en te raadplegen.

Maar je kunt je vraag ook aan Google stellen, welke je dan zal vertellen dat de drempel ligt op 4 volt.
Daarmee kun je m dus niet (direct) gebruiken voor jouw schakeling.
Uiteraard kun je wel iets toevoegen aan je schakeling, een enkele transistor waarmee je dit voor mekaar krijgt.
De transistor heeft dan wel als gevolg dat het signaal geïnverteerd zal worden, maar dat kun je oplossen door jouw code andersom te laten schakelen.
De transistor heeft ook wat weerstanden nodig om correct te werken.

Dank

Ik gebruik nu de ifrz 44n. En nu werkt de schakeling gelukkig wel.

Mogelijk met een transistor ervoor nog iets beter.
Maar geen idee hoe je het signaal moet omkeren

Ventilator gaat nu pas draaien als het percentage
60% is.

Zo lastig kan dat toch niet zijn ?
Nu stuur je D0 aan met een 1 of met een nul om de FET te schakelen.
Wat zou je dan moeten doen om dat om te keren ?

De weerstand op de gate naar 3,3 volt zetten ipv naar aarde ?

Nee.
Dat is een aanpassing in de hardware (die niet het gewenste resultaat zal hebben).

Ik had het over een aanpassing in de code.
Aangezien ik in de code die je getoond heb, niet kan zien wat je naar D0 stuurt, kan ik je ook niet vertellen wat je er nu heen moet sturen.
Daarom dit voorbeeld dat is gebaseerd op een aanname:
Wanneer je nu een HIGH of een 1 naar D0 stuurt om de FET te activeren, zou je in dat geval een LOW of een 0 naar D0 moeten sturen.