nodo-domotica.nl

Even voorstellen

Vertel iets over jezelf, je achtergrond en wat voor doel je voor ogen hebt met de Nodo.

Even voorstellen

Berichtdoor PeterB » 01 maart 2014, 22:02

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;
  }
PeterB
 
Berichten: 17
Geregistreerd: 01 maart 2014, 21:27

Re: Even voorstellen

Berichtdoor rwijbenga » 02 maart 2014, 19:03

Dat ziet er puik uit!!

Snel maar eens proberen in een project. :D
rwijbenga
 
Berichten: 344
Geregistreerd: 28 aug 2011, 14:58

Re: Even voorstellen

Berichtdoor NIB0R » 14 maart 2014, 16:18

Hooi PeterB,

Bedankt voor je code. Er staat wel een klein foutje in. Op regel 117 stuur je fan 2 aan ipv fan 3.

Code: Selecteer alles
     switch (event->Par1)
       {
      case 1:
          analogWrite(FAN_1,Power);
        break;
      case 2:
        analogWrite(FAN_2,Power);
        break;
      case 3:
        analogWrite(FAN_2,Power); <----------
      }     
NIB0R
 
Berichten: 2
Geregistreerd: 29 okt 2013, 22:16

Re: Even voorstellen

Berichtdoor PeterB » 14 maart 2014, 20:43

Bedankt voor je reactie Nibor, was me zelf nog niet opgevallen. Ik gebruik momenteel alleen de FAN1 uitgang vandaar.
PeterB
 
Berichten: 17
Geregistreerd: 01 maart 2014, 21:27


Keer terug naar Even voorstellen

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers. en 2 gasten

cron