Men jag håller på att utveckla mina rumsmojänger som ska mäta, visa och kommunicera.
Just nu har jag en ESP32 på bänken med en OLED via SPI, en DS18B20 via OneWire då, en TTL-RS485.
Programmet ser ut som prutt, men det är ju i nån testfas att få alla prylar att funka.
Funktionen är enkel, läs av tempgivaren, korrigera, presentera på OLED.
Temp och korrigering finns via modbus också.
Problemet nu är att så fort jag sätter korrigeringen till ett negativt tal så är det som en unsigned slår runt, men bara på OLED, aldrig via modbus.
Funkar på OLED och modbus:
Läst temp, oavsett positiv eller negativ temp.
Korrigering från 0 och positivt uppåt.
Funkar på modbus bara (OLED visar 65536 - vad som nu försöker visas)
Läst temp, oavsett positiv eller negativ temp.
Korrigering från -0,1 och neråt.
Jag förstår inte varför BÅDE temp och korrigering skiter sig när korrigering blir ett negativt värde. Tempen kan vara negativ eller positiv utan påverkan.
Och det slår ju om, men inga unsigned används ju.
Om jag i ModScan32 (modbus poller) väljer att läsa som "Decimal" (unsigned) istället för "Integer" (signed) så får jag samma värden som på OLED när OLED knasar.
Bifogar koden nedan, eftersom allt funkar över modbus så vill jag ju tro att det är konverteringen till sträng som skiter sig. Men bara när korrigering går negativt, inte temp.
Kod: Markera allt
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ModbusRTU.h>
#include <OneWire.h>
#include <DallasTemperature.h>
const int oneWireBus = 1;
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);
#define REGN 10
#define SLAVE_ID 1
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
ModbusRTU mb;
void setup() {
Serial2.begin(9600, SERIAL_8N1, 16, 17);
mb.begin(&Serial2);
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.display();
delay(500); // Pause for 20 milliseconds
display.clearDisplay();
mb.slave(SLAVE_ID);
mb.addHreg(REGN);
mb.addHreg(11);
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
int iCorr = mb.Hreg(11);
float fCorr = (float)iCorr / 10.0;
temperatureC = temperatureC + fCorr; //Korrigering
int iTemp = temperatureC * 10; //Konvertera till int x10
mb.Hreg(REGN, iTemp); //Sätt värde i holding 10 (REGN)
//int iValue = mb.Hreg(REGN);
String sTemp = String(temperatureC, 1); //konvertera till sträng med 1 decimal
String sCorr = String(fCorr, 1); //konvertera till sträng med 1 decimal
visa(sTemp, sCorr);
mb.task();
yield();
}
//void visa(int iInValue) {
void visa(String sInValue, String sCorr) {
display.clearDisplay();
display.setTextSize(3); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.println(sInValue);
display.setCursor(0,24); // rad 2
display.println(sCorr);
display.display();
}