Advertisement
Guest User

Untitled

a guest
Jul 19th, 2019
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. #include <AutoPID.h>
  2. #include <DallasTemperature.h>
  3. #include <OneWire.h>
  4.  
  5. //pins
  6. #define POT_PIN A0
  7. #define OUTPUT_PIN A1
  8. #define TEMP_PROBE_PIN 5
  9. #define LED_PIN 6
  10.  
  11. #define TEMP_READ_DELAY 800 //can only read digital temp sensor every ~750ms
  12.  
  13. //pid settings and gains
  14. #define OUTPUT_MIN 0
  15. #define OUTPUT_MAX 255
  16. #define KP .12
  17. #define KI .0003
  18. #define KD 0
  19.  
  20. double temperature, setPoint, outputVal;
  21.  
  22. OneWire oneWire(TEMP_PROBE_PIN);
  23. DallasTemperature temperatureSensors(&oneWire);
  24.  
  25. //input/output variables passed by reference, so they are updated automatically
  26. AutoPID myPID(&temperature, &setPoint, &outputVal, OUTPUT_MIN, OUTPUT_MAX, KP, KI, KD);
  27.  
  28. unsigned long lastTempUpdate; //tracks clock time of last temp update
  29.  
  30. //call repeatedly in loop, only updates after a certain time interval
  31. //returns true if update happened
  32. bool updateTemperature() {
  33. if ((millis() - lastTempUpdate) > TEMP_READ_DELAY) {
  34. temperature = temperatureSensors.getTempCByIndex(0); //get temp reading
  35. lastTempUpdate = millis();
  36. temperatureSensors.setResolution(12); //request reading for next time
  37. return true;
  38. }
  39. return false;
  40. }//void updateTemperature
  41.  
  42.  
  43. void setup() {
  44. pinMode(POT_PIN, INPUT);
  45. pinMode(OUTPUT_PIN, OUTPUT);
  46. pinMode(LED_PIN, OUTPUT);
  47.  
  48. temperatureSensors.begin();
  49. temperatureSensors.setResolution(12);
  50. while (!updateTemperature()) {} //wait until temp sensor updated
  51.  
  52. //if temperature is more than 4 degrees below or above setpoint, OUTPUT will be set to min or max respectively
  53. myPID.setBangBang(4);
  54. //set PID update interval to 4000ms
  55. myPID.setTimeStep(4000);
  56.  
  57. }//void setup
  58.  
  59.  
  60. void loop() {
  61. updateTemperature();
  62. // setPoint = analogRead(POT_PIN);
  63. setPoint = 38.5;
  64. myPID.run(); //call every loop, updates automatically at certain time interval
  65. analogWrite(OUTPUT_PIN, outputVal);
  66. digitalWrite(LED_PIN, myPID.atSetPoint(1)); //light up LED when we're at setpoint +-1 degree
  67.  
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement