---
# System prepended metadata

title: Ölands Köksmejeri

---

# Ölands Köksmejeri 


## Mål
- Autamtisera flödet så att man kan schemalägga pastörisering som är väldigt tidsödande till nattetid när strömmen är billig. 
- Programmera hela recept på olika ystningar.
- Få grytan att larma vid vissa uppnådda värden som temperatur, tid och PH-värde för att säkra kvaliten i produktionen
- Få grytan att skicka loggdata till databas för att kunna knyta ihop all info om varje batch. Val av databas/presentation.

## Arkitektur
![](https://hackmd.io/_uploads/ry9WGLz6h.png)


## Hårdvara 
![](https://hackmd.io/_uploads/rkgJ9XSfp2.png)

-  [ESP32 PLC 38R](https://www.industrialshields.com/shop/034001000300-esp32-plc-38r-2906?product=product.template%282906%2C%29#attr=142,2244,2245,3729,2246,4064,3806)
-  Övrig hårdvara:

| Funktion |	Relä	|Analog in	|Digital in|	Analog ut |	Digital ut|
| -------- | -------- | -------- |-------- |-------- |-------- |
|Värmare 1                          |X| || |X|
|Värmare 2                          |X| || |X|
|Omrörning vänster	                |X| || |X|
|Omrörning höger	                |X| || |X|
|Omrörning hastighet                | | ||X| |
|Temperaturgivare PT100	            | |X|| | |		
|Nivågivare vatten i manteln	    | | || | |				
|Magnetventil vatten in (kallt)	    |X| || | |		
|Magnetventil vatten ut (kallt/hett)|X| || | |		
|**Övriga grejer på önskelistan** 					
|Flödesgivare vatten                | |X|| | |			
|PH-mätare mjölk                    | |X|| | |				
|Dispenser för kultur, flytande     |X| || | |			
|Dispenser för löpe, flytande	    |X| || | |				

## Node-Red

![](https://hackmd.io/_uploads/SJkabkrp3.png)


### PLC Code 

```cpp
/*
   Copyright (c) 2018 Boot&Work Corp., S.L. All rights reserved

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <Ethernet.h>
#include <ModbusTCPSlave.h>

// Ethernet configuration values
uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };
IPAddress ip(192, 168, 1, 170);
const uint16_t port = 502;

// Modbus registers mapping
// This example uses the M-Duino21+ mapping
int digitalOutputsPins[] = {
  R0_1, R0_2, R0_3, R0_4, R0_5, R0_6, R0_7, R0_8, R1_1, R1_2, R1_3, R1_4, R1_5, R1_6, R1_7, R1_8
};


#define numDigitalOutputs int(sizeof(digitalOutputsPins) / sizeof(int))
#define numAnalogOutputs int(20)

bool digitalOutputs[numDigitalOutputs];
uint16_t analogOutputs[numAnalogOutputs];

// Define the ModbusTCPSlave object
ModbusTCPSlave modbus(port);

////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  Serial.begin(9600UL);

  // Init variables, inputs and outputs
  for (int i = 0; i < numDigitalOutputs; ++i) {
    digitalOutputs[i] = false;
    digitalWrite(digitalOutputsPins[i], digitalOutputs[i]);
  }

  // Init Ethernet
  Ethernet.begin(mac, ip);
  Serial.println(Ethernet.localIP());

  // Init ModbusTCPSlave object
  modbus.begin();

  modbus.setCoils(digitalOutputs, numDigitalOutputs);
  modbus.setHoldingRegisters(analogOutputs, numAnalogOutputs);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {

  // Process modbus requests
  modbus.update();

  // Update outputs
  for (int i = 0; i < numDigitalOutputs; ++i) {
    digitalWrite(digitalOutputsPins[i], digitalOutputs[i]);
  }
  for (int i = 0; i < numAnalogOutputs; ++i) {
    Serial.print(analogOutputs[i]);
    Serial.print(" ");
  }
  Serial.println();
}
```
