Ik heb een jaartje geleden met een paar arduino's 2 controllers gemaakt voor het aansturen van een aquarium. Denk hierbij aan het sturen van de LED verlichting, CO2 toevoeging, meten temperatuur van het water en de LED balk, inschakelen van FAN's als een bepaalde temperatuur wordt bereikt etc. Een volgende stap die ik wilde maken is het kunnen uitlezen van deze gegevens en eventueel besturen via een tablet of iets dergelijks. Zoekende op het web naar wat ideeën kwam ik de Nodo tegen. Hierin zijn veel aspecten aanwezig van datgene wat ik voor ogen heb. Voor de meeste dingen zijn al plugins aanwezig en de webapp ziet er ook goed uit. Al spelende met de nodo liep ik tegen het probleem aan dat het besturen van ventilatoren (12V Casefan's uit een computer) niet een twee drie mogelijk was met de beschikbare plugins. Dus maar meteen zelf de stoute schoenen aangetrokken en zelf iets in elkaar geknutseld. Hierbij de code, misschien heeft iemand er nog iets aan.
- Code: Selecteer alles
//#######################################################################################################
//#################################### Plugin-250: FANcontrol ###########################################
//#######################################################################################################
/*********************************************************************************************\
* Funktionele beschrijving: Deze plugin bestuurd een of meerdere FAN's welke aangesloten zitten op 3 PWM
poorten van een MEGA. Werkt niet op een Small omdat de 3 poorten bij elkaar
horen ivm bepaalde registers in de Arduino welke gemodificeerd moeten worden om de PWM
frequentie te kunnen wijzigen. Door het wijzigen van zo'n register
wordt de normale PWM fequentie van 490Hz verhoogd naar ca 31kHz. Dit is nodig om
te zorgen dat aangestuurde FAN's (veelal 12V casefan's van een computer) geen
geluid maken. Het instellen van een register voor deze verhoogde frequentie heeft
invloed op alle drie de poorten.
A.h.v. de meegegeven Wenstemperatuur en de gemeten temperatuur (waarvan de waarde in een
variabele staat) wordt het toerental van de FAN bepaald. Het uitgestuurde vermogen (0..255)
naar de FAN wordt geplaatst in een variabele zodat deze weer is uit te lezen en dus in
beeld is te brengen op de webapp.
*
* Auteur : Peter B
* Support : <website>
* Datum : 1-3-2014
* Versie : 1.0
* Nodo productnummer : <Nodo productnummer. Toegekend door Nodo team>
* Compatibiliteit : Vanaf Nodo build nummer <build nummer>
* Syntax : "FANcontrol <FANnr>, <WensTemp>, <GemetenTemp:variabele>, <Power:variabele>"
*
***********************************************************************************************
* Technische beschrijving:
*
* Compiled size : <grootte> bytes voor een Mega en <grootte> voor een Small.
* Externe funkties : GetArgv()
*
\*********************************************************************************************/
#define PLUGIN_NAME "FANcontrol"
#define PLUGIN_ID 250
#if NODO_MEGA
#define FAN_1 6
#define FAN_2 7
#define FAN_3 8
#endif
boolean Plugin_250(byte function, struct NodoEventStruct *event, char *string)
{
boolean success=false;
const byte MaxDeviatie = 2; // Maximum afwijking van de gewenste temperatuur. Hierboven draaien de Fan's op max vermogen
const byte MinPower = 2; // Minimale uitsturing naar de Fan's om te voorkomen dat ze niet opstarten
byte Power; // Berekend vermogen wat naar de FAN wordt gestuurd. Varieert van MinPower..255
byte MeasuredTempVar; // Nummer van de Nodovariabele waarin de gemeten temperatuur is opgeslagen
byte WishTemp; // De gewenste temperatuur welke dmv de FAN's moet worden bereikt
switch(function)
{
#ifdef PLUGIN_250_CORE
case PLUGIN_INIT:
{
// Stel de betreffende 3 pinnen als output in
pinMode(FAN_1, OUTPUT);
pinMode(FAN_2, OUTPUT);
pinMode(FAN_3, OUTPUT);
// Stel de bijbehorende timer van de Arduino zodanig in zodat 12V FAN's geen herrie maken door de lage standaard PWM frequentie van 490Hz
// Deze wordt nu vast ingesteld op 31374 Hz
#if NODO_MEGA
TCCR4B=(TCCR4B & 0xF8) | 0x00; // Reset de bits welke de PWM frequentie bepalen van dit register
TCCR4B=(TCCR4B & 0xF8) | 0x01; // Set de bits zodanig dat de gewenste frequentie wordt bereikt
#else
#endif
// Zet de uitgang van de FAN drivers op 0
analogWrite(FAN_1,0);
analogWrite(FAN_2,0);
analogWrite(FAN_3,0);
break;
}
case PLUGIN_COMMAND:
{
MeasuredTempVar = (event->Par2 >> 8) & 0xff; // Bepaal nodo variabele waarin de gemeten temperatuur is opgeslagen
WishTemp = (event->Par2 >> 16) & 0xff; // Bepaal de gewenste temperatuur
// Bereken het uit te sturen FAN vermogen
if (UserVar[MeasuredTempVar-1] < WishTemp) // Gemeten temperatuur is lager dan de WishTemperatuur
{
Power = 0; // dus geen stroom naar de FAN
}
else
{
if (UserVar[MeasuredTempVar-1] >= (WishTemp + MaxDeviatie)) //Gemeten temperatuur is hoger dan de max gewenste (wens + afwijking)
{
Power = 255; // dus maximaal vermogen naar de FAN's
}
else
{ // Bereken het FAN vermogen als de gemeten temperatuur binnen het Deviatie gebied valt
Power = (((UserVar[MeasuredTempVar-1] - WishTemp) * 255) / MaxDeviatie);
if (Power < MinPower) Power = MinPower;
}
}
// Zet het berekende vermogen van de FAN in de Nodovariabele
UserVar[((event->Par2) & 0xff) - 1] = Power;
// Stuur de geselecteerde FAN aan.
switch (event->Par1)
{
case 1:
analogWrite(FAN_1,Power);
break;
case 2:
analogWrite(FAN_2,Power);
break;
case 3:
analogWrite(FAN_2,Power);
}
success=true;
break;
}
case PLUGIN_SERIAL_IN:
{
break;
}
#endif // CORE
#if NODO_MEGA // alleen relevant voor een Nodo Mega want de Small heeft geen MMI!
case PLUGIN_MMI_IN:
{
char *TempStr=(char*)malloc(INPUT_COMMAND_SIZE);
// Dit is het eerste argument in het commando.
if(GetArgv(string,TempStr,1))
{
if(strcasecmp(TempStr,PLUGIN_NAME)==0) // Check of eerste param = plugin name (Commando)
{
if(GetArgv(string,TempStr,2))
{
event->Par1 = str2int(TempStr);
if(event->Par1 > 0 && event->Par1 <= 3) // FAN besturing (1, 2 of 3)
{
if(GetArgv(string,TempStr,3))
{
event->Par2 = (str2int(TempStr)<<16); // WensTemperatuur
if(GetArgv(string,TempStr,4))
{
if (str2int(TempStr) > 0 && str2int(TempStr) <= USER_VARIABLES_MAX-1)
{
event->Par2 |= (str2int(TempStr)<<8); // Variabele waarin de gemeten temperatuur staat
if(GetArgv(string,TempStr,5))
{
if (str2int(TempStr) > 0 && str2int(TempStr) <= USER_VARIABLES_MAX-1)
{
event->Par2|=str2int(TempStr); // Variabele waarin het uitgestuurde FAN vermogen wordt gezet
event->Type = NODO_TYPE_PLUGIN_COMMAND;
event->Command = 250; // Nummer van deze plugin
success=true;
}
}
}
}
}
}
}
}
}
free(TempStr);
break;
}
case PLUGIN_MMI_OUT:
{
strcpy(string,PLUGIN_NAME); // Commando
strcat(string," ");
strcat(string,int2str(event->Par1)); // Parameter-1 = FAN nummer (8-bit)
strcat(string,",");
strcat(string,int2str((event->Par2 >> 16) & 0xff)); // Parameter-2 = Gewenste temperatuur (8-bit)
strcat(string,",");
strcat(string,int2str((event->Par2 >> 8) & 0xff)); // Parameter-3 = Variabele nr met daarin de gemeten temperatuur (8-bit)
strcat(string,",");
strcat(string,int2str((event->Par2) & 0xff)); // Parameter-4 = Variabele nr met daarin het uitgestuurde vermogen naar de FAN (8-bit)
break;
}
#endif //MMI
}
return success;
}