Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. #include "math.h"
  2. #include <PID_v1.h>
  3.  
  4. //HEATING
  5. #define THERMISOR_PIN A0
  6. const byte HEATER_PIN = 6;
  7. const byte VCC = 5;
  8. const int B_TEMP_CONST = 4220;
  9. const float T0_K = 298.15;
  10. double tempReading, DIFF, rThermistor, temp, limit;
  11.  
  12. //STIRRING
  13. double target, readRPM;
  14. double writeRPM = 24;
  15.  
  16. PID motorPID(&readRPM, &writeRPM, &target, 0.04,0.014,0.012, DIRECT); //last known good 0.017 0.025 0.01
  17.  
  18. int things[100];
  19.  
  20. volatile long unsigned last = 0;
  21. volatile long unsigned now = 1;
  22. static unsigned long last_interrupt = 0;
  23. volatile bool doit = false;
  24.  
  25. float RPM = 0;
  26. float RPMsmooth = 0;
  27. float RPMlast = 0;
  28. float expCoeff = 0.05;
  29.  
  30. float phTarget, tempTarget, rpmTarget;
  31.  
  32. void setup() {
  33. Serial.begin(9600);
  34. pinMode(THERMISOR_PIN, INPUT);
  35. //pinMode(8, OUTPUT);
  36. //digitalWrite(8, HIGH);
  37. Serial.begin(9600);
  38. pinMode(3, OUTPUT);
  39. pinMode(2, INPUT); //interrupt
  40. analogWrite(3, 27);
  41. pinMode(8, OUTPUT); //heating element control
  42. attachInterrupt(digitalPinToInterrupt(2), thing, RISING);
  43. target = 500;
  44. motorPID.SetMode(AUTOMATIC);
  45.  
  46. }
  47.  
  48. void loop() {
  49. //use 5v on arduino
  50.  
  51. //Serial.println(RTH);
  52.  
  53.  
  54. if(Serial.available() > 0)
  55. {
  56. if(Serial.readStringUntil('#') == "Confirm")
  57. {
  58. phTarget = Serial.readStringUntil(',').toFloat();
  59. tempTarget = Serial.readStringUntil(',').toFloat();
  60. rpmTarget = Serial.readStringUntil('\n').toFloat();
  61. }
  62. //Serial.println(target);
  63. }
  64.  
  65.  
  66. float RPM = readControlStirring(rpmTarget);
  67.  
  68. float temp_DEG = readControlTemperature(tempTarget);
  69.  
  70. float PH = 7;
  71.  
  72.  
  73. Serial.print(RPM); Serial.print(",");
  74. Serial.print(temp_DEG); Serial.print(",");
  75. Serial.print(PH); Serial.println(",#");
  76.  
  77.  
  78. }
  79.  
  80.  
  81.  
  82. double readControlTemperature(float inputTemp){
  83.  
  84.  
  85. double vThermistor = readThermistor();
  86.  
  87. double temp_DEG = calculateTemp(vThermistor);
  88.  
  89. delay(10);
  90.  
  91. //Serial.println(temp_DEG);
  92. delay(100);
  93. int limit = 1.25;
  94. if (temp_DEG <= inputTemp - limit ){
  95. //analogWrite(HEATER_PIN, 255);
  96. digitalWrite(8, HIGH);
  97.  
  98. //Serial.println("ON");
  99. }
  100. else {
  101. //analogWrite(HEATER_PIN, 0);
  102. //Serial.println("OFF");
  103. digitalWrite(8, LOW);
  104. }
  105.  
  106. return temp_DEG;
  107.  
  108. }
  109.  
  110.  
  111. float readControlStirring(float Target){
  112.  
  113. target = Target;
  114.  
  115. if(micros()-now > 1000000) { last = now - 60000000000; }
  116. RPM = 30000000.0/float((now - last));
  117. RPMsmooth = expCoeff * RPM + (1-expCoeff)*RPMlast;
  118. readRPM = RPMsmooth;
  119. //Serial.print(RPMsmooth); Serial.print(" ");
  120. //Serial.println(Target);
  121.  
  122. if (RPMsmooth < 2800)
  123. {
  124. motorPID.Compute();
  125. }
  126. analogWrite(3, writeRPM);
  127.  
  128. RPMlast = RPMsmooth;
  129. //if (doit == true) {Serial.println(millis()); doit = false;}
  130.  
  131. return RPMsmooth;
  132.  
  133. }
  134.  
  135.  
  136.  
  137.  
  138.  
  139. double readThermistor(){
  140.  
  141. double vThermistor = analogRead(THERMISOR_PIN);
  142.  
  143. return vThermistor;
  144.  
  145. }
  146.  
  147.  
  148. double calculateTemp(double vThermistor){
  149.  
  150. double vResistor = VCC * (vThermistor/1023);
  151.  
  152. double rThermistor = (9780*vResistor)/(VCC-vResistor);
  153.  
  154. double temp_K = 1 / ((log(rThermistor / 10000) / B_TEMP_CONST ) + (1/T0_K));
  155.  
  156. double temp_DEG = temp_K-273.15;
  157.  
  158. return (temp_DEG - 1);
  159.  
  160. }
  161.  
  162. void thing()
  163. {
  164. unsigned long interrupt_now = millis();
  165. if(interrupt_now - last_interrupt > 4)
  166. {
  167. //doit = true;
  168. last = now;
  169. now = micros();
  170. }
  171. last_interrupt = interrupt_now;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement