View Single Post
GreenRay's Avatar
Trådstarter
Begynner virkelig å føle tidspresset nå!

Platene som er til eloksering er ENDA mer forsinket, hvis de ikke blir ferdig til Onsdag må jeg hente de uansett.

Har startet å plukke deler fra min gamle PC, og har gjort klart til å montere alt når platene kommer.





Måtte også snu vifta til strømforsyningen 180 grader, så det er nå i boks.


Når det kommer til programmering av styring til vannkjøling, er jeg på god vei! Har endelig knekt koden

Arduinoen mottar en streng med informasjon om hastighet på vifter/pumpe og fargekoder til RGB lysene. I tillegg sender den verdier fra analog inngangen.

Er enda mye programmering igjen, men så lenge styring av vifter, pumpe og lys fungerer, så har jeg noe å pusle med på The Gathering

Slik ser programmet ut hittil:

Kode

//Styring av vannkjøling v3.0

//LabView sender hastighet på vifter, pumpe og fargekoder til lysene
//Arduino sender informasjon om temperatur og strømning i rørene


#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

#define PIN 6 // Definerer hvilken pinne NeoPixelene er koblet til
#define NUMPIXELS // Definerer antal NeoPixler som er kolet til

const byte buffSize = 40;
char inputBuffer[buffSize];
const char startMarker = '<'; // Startmerke til string fra PC
const char endMarker = '>'; // Endemerke til string fra PC
byte bytesRecvd = 0;
boolean readInProgress = false;
boolean newDataFromPC = false;
char messageFromPC[buffSize] = {0};

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 
Adafruit_DCMotor *fanOne = AFMS.getMotor(1); // Vifter til radiator 1 er koblet til kanal M1
Adafruit_DCMotor *fanTwo = AFMS.getMotor(2); // Vifter til radiator 2 er koblet til kanal M2
Adafruit_DCMotor *pump = AFMS.getMotor(2); // Vannpumpe er koblet til kanal M3
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // Oppsett av NeoPixler


int fanOneSpeed = 255; // Oppstartshastighet til radiator 1
int fanTwoSpeed = 255; // Oppstartshastighet til radiator 2
int pumpSpeed = 255; // Oppstartshastighet til vannpumpe

int red = 0; // Rødfarge til NeoPixel
int green = 0; // Grønnfarge til NeoPixel
int blue = 255; // Blåfarge til NeoPixel

int sensorPin = A0; // Lyssensor for test
int sensorValue; // Verdi til lyssensor

void setup() {
  Serial.begin(9600); 
  AFMS.begin(); // Deafault frekvens til motorshield. Ingen spesifisert = 1,6KHz
  pixels.begin(); 
  
  fanOne->setSpeed(fanOneSpeed); // Oppstart av vifter til radiator 1
  fanOne->run(FORWARD); // Rotasjonsretning 
  fanTwo->setSpeed(fanTwoSpeed); // Oppstart av vifter til radiator 2
  fanTwo->run(FORWARD); // Rotasjonsretning 
  pump->setSpeed(pumpSpeed); // Oppstart av vannpumpe
  pump->run(FORWARD); // Rotasjonsretning 
}

void loop() {
  ReciveData(); // Mottar data
  updateValues(); // Oppdaterer verdier
  readTemp(); // Leser temperatur
  Test(); // Sender verdier til PC
}

void ReciveData() { // Mottar data fra PC, og lagrer den i inputBuffer
    
  if(Serial.available() > 0) { // Hvis vi mottar data

    char x = Serial.read(); // Leser karakter for karakter
      
    if (x == endMarker) { // Hvis lest karakter er >
      readInProgress = false;
      newDataFromPC = true; // Sier ifra at vi har mottat nye verdier
      inputBuffer[bytesRecvd] = 0;
      parseData();
    }
    
    if(readInProgress) { // Hvis vi enda leser strengen
      inputBuffer[bytesRecvd] = x; // Lagrer karakteren i inputBuffer
      bytesRecvd ++;
      if (bytesRecvd == buffSize) { // Hvis vi har fylt opp bufferen
        bytesRecvd = buffSize - 1;
      }
    }

    if (x == startMarker) {  // Hvis vi mottar <, altså starten på strengen
      bytesRecvd = 0; 
      readInProgress = true;
    }
  }
}
 
void parseData() { // Flytter verdiene i inputBuffer til riktig variabel
    
  char * strtokIndx; 
 
  strtokIndx = strtok(inputBuffer,";");      // get the first part - the string
  fanOneSpeed = atoi(strtokIndx); // Kopierer verdien til riktig variabel
  
  strtokIndx = strtok(NULL, ";"); // Henter ut neste del av strengen
  fanTwoSpeed = atoi(strtokIndx);     // Kopierer verdien til riktig variabel

  strtokIndx = strtok(NULL, ";"); // Henter ut neste del av strengen
  pumpSpeed = atoi(strtokIndx);     // Kopierer verdien til riktig variabel
  
  strtokIndx = strtok(NULL, ";"); // Henter ut neste del av strengen
  red = atoi(strtokIndx);     // Kopierer verdien til riktig variabel
  
  strtokIndx = strtok(NULL, ";"); // Henter ut neste del av strengen
  green = atoi(strtokIndx);     // Kopierer verdien til riktig variabel
  
  strtokIndx = strtok(NULL, ";"); // Henter ut neste del av strengen
  blue = atoi(strtokIndx);     // Kopierer verdien til riktig variabel
}

void Test() {

  if (newDataFromPC) {
    newDataFromPC = false;
    Serial.print("Radiator 1");
    Serial.println(fanOneSpeed);
    Serial.print("Radiator 2");
    Serial.println(fanTwoSpeed);
    Serial.print("Vannpumpe");
    Serial.println(pumpSpeed);
    Serial.print("Red");
    Serial.println(red);
    Serial.print("Green");
    Serial.println(green);
    Serial.print("Blue");
    Serial.println(blue);
    Serial.print("Light");
  }
}

void updateValues() {
   fanOne->setSpeed(fanOneSpeed);
   fanOne->run(FORWARD);
   
   fanTwo->setSpeed(fanTwoSpeed);
   fanTwo->run(FORWARD);
   
   pump->setSpeed(pumpSpeed);
   pump->run(FORWARD);
   
   pixels.setPixelColor(1, pixels.Color(red,green,blue)); // Fargeblanding
   pixels.show(); // Sender informasjonen til pixlene
}

void readTemp() {
  sensorValue = analogRead(sensorPin);
  Serial.println(sensorValue);
  delay(10);
  }
@GreenRay
Sist endret av GreenRay; 28. oktober 2019 kl. 10:06.