Sur un autre post, comme je n'arrivais pas à calibrer le Ky-013, j'ai regardé les exemples de la bibliothèque Data-fruits
et j'ai vu l'exemple TwoPin_DS18B20.
Du coup je tente de le combiner avec mon code poue écran oled I2c 128x64.
J'ai une erreur (voir fin du post) où l'on parle de
' redeclaration of 'int readVal'
mais je ne trouve pas où ?
code de base des 2 sondes DS18B20
//
// FILE: TwoPin_DS18B20.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// PURPOSE: two pins for two sensors demo
// DATE: 2014-06-13
// URL: http://forum.arduino.cc/index.php?topic=216835.msg1764333#msg1764333
//
// Released to the public domain
//
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_1 2
#define ONE_WIRE_BUS_2 4
OneWire oneWire_in(ONE_WIRE_BUS_1);
OneWire oneWire_out(ONE_WIRE_BUS_2);
DallasTemperature sensor_inhouse(&oneWire_in);
DallasTemperature sensor_outhouse(&oneWire_out);
void setup(void)
{
Serial.begin(9600);
Serial.println("Dallas Temperature Control Library Demo - TwoPin_DS18B20");
sensor_inhouse.begin();
sensor_outhouse.begin();
}
void loop(void)
{
Serial.print("Requesting temperatures...");
sensor_inhouse.requestTemperatures();
sensor_outhouse.requestTemperatures();
Serial.println(" done");
Serial.print("Inhouse: ");
Serial.println(sensor_inhouse.getTempCByIndex(0));
Serial.print("Outhouse: ");
Serial.println(sensor_outhouse.getTempCByIndex(0));
}
Comment écrire sur une seule ligne les 2 températures , et si possible le C après les 2 ?
Et surtout.
Ce code prend 87% de la mémoire. Je veux l'incorporer à mon projet de bateau qui fait 17% de mémoire.
Je vais avoir des pb ?
le code
/* utilisation de A0 pour le voltage avec resistance en //
pin 4 pour l'AIR DS18b20EAU
des A4 et A5 pour l'écran
du pin 2 pour l'eau DS18b20EAU
AO récupère l'information du voltage avec GND fil direct à la batterie mais avec resistance en parallèle !!
pin 4 AIR récupère l'information de la température de la sonde étanche 1m DS18B20
pin 2 EAU récupère l'information de la température de la sonde étanche 1m DS18B20
A4 et A5 affichage de l'écran
"5 Volt c'est la tension de la référence de tension de l'ADC.
J'espère que tu n'as pas raccordé directement le 12V à A0 ?
Il faut placer un pont diviseur à deux résistances pour que la tension sur A0 soit inférieure à 12V".
*/
#include <DallasTemperature.h> //DS18B20 pour température de l'eau et de l'air
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
/* Essai affichage voltage, température air et eau
// http://www.instructables.com/id/Arduino-OLED-Voltage-Meter/ le voltmètre
// A0 et GND entre les deux mettre resistance ( voir le lien)ici A0 pour le voltage
// A0 est lié à la batterie et GND à l'autre pôle de la batterie
// http://edu.mrpigg.ca/termo.html thermo resistor Keyes KY-013 pour l'air
// https://letmeknow.fr/blog/2016/08/10/le-capteur-de-temperature-ds18b20/
//les librairies de l'écran
//https://github.com/adafruit/Adafruit_SSD1306
//https://github.com/adafruit/Adafruit-GFX-Library
//les librairies de la sonde étanche DS18B20
//https://github.com/PaulStoffregen/OneWire
*/
// les branchements
// L'écran OLED
#define OLED_RESET 8 // pin 8 'virtuel' ?
Adafruit_SSD1306 display(OLED_RESET);
//définition de la taille de l'écran
#define SSD1306_128_64 // à modifier dans le dossier Liraries / dossier Adafruit_SSD1306.h avec
// éditeur de texte #define SSD1306_128_64 et pour les autres définitions d'écran
// écrire //#define SSD1306_128_32 #define SSD1306_128_16
// les 2 sondes DS18B20
#define ONE_WIRE_BUS_1 2 // sonde pour l'eau pin 2
#define ONE_WIRE_BUS_2 4 // sonde pour l'air pin 4
OneWire oneWire_in(ONE_WIRE_BUS_1); // sonde pour l'eau
OneWire oneWire_out(ONE_WIRE_BUS_2); // sonde pour l'air
DallasTemperature sensor_eau(&oneWire_in); // sonde pour l'eau
DallasTemperature sensor_air(&oneWire_out); // sonde pour l'air
//*****************************
// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN 2 //***********************************************************pin 4 pour voiture bateau
OneWire oneWire(EAU_TEMPERATURE_PIN);
DallasTemperature sensors(&oneWire);
/*-------------------------------------------------------------------------------------
Template file for 4-pin I2C OLED display, e.g. from Geekcreit
using Adafruit SSD1306 driver and GFX libraries.
Tutorial:
https://startingelectronics.org/tutorials/arduino/modules/OLED-128x64-I2C-display/
-------------------------------------------------------------------------------------*/
// OLED display TWI address
#define OLED_ADDR 0x3C // C avant a modifier peut-etre
//------------------------------------------
//------------------------------------------
void setup() {
// initialize and clear display
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);// programme scanner
display.clearDisplay();
display.display();
// start serial port
Serial.begin(115200);
Serial.println("Dallas Temperature Control Library Demo - TwoPin_DS18B20");
// Start up the library
sensor_eau.begin(); // sonde pour l'eau
sensor_air.begin(); // sonde pour l'air
// déclaration de la pin 2 et 4
pinMode(2, INPUT);
pinMode(4, INPUT);
int readValEau = analogRead(2);// met à zéro la sonde EAU
int readValAir = analogRead(4);// met à zéro la sonde AIR
}
void loop() {
// AFFICHAGE SUR SERIAL
Serial.print("Recherceh des temperatures...");
sensor_eau.requestTemperatures();
sensor_air.requestTemperatures();
Serial.println(" done");
// sonde EAU
Serial.print("Température eau: ");
Serial.println(sensor_eau.getTempCByIndex(0));
// sonde AIR
Serial.print("Température air: ");
Serial.println(sensor_air.getTempCByIndex(0));
// AFFICHAGE SUR ECRAN
delay(1);//delay time 1 milli second
display.clearDisplay();
display.setTextSize(1);//text size
display.setTextColor(WHITE);//text color
display.setCursor(0, 0);
display.println("NIVEAU BATTERIE");//affiche texte 1ere ligne 8 pixels
//*****************************
//display.setTextColor(BLACK, WHITE);
//display.println(); // affiche une ligne noire
//*****************************
// Affichage sur la même ligne des 2 températures Air et Eau
display.setTextSize(1);//text size // mettre 2 pour 16 pixels
display.setCursor(0, 42); // position du curseur
display.print("TEMP. AIR ");//affiche texte 1ere ligne 8 pixels
//display.print( temp ); // ici on met la 1° température air(sonde étanche)(pin4)
display.println(sensor_air.getTempCByIndex(0));
display.print("'"); //Affichage du symbole <C>
display.print("C"); //Affichage du symbole <C>
display.setTextSize(1);//text size // mettre 2 pour 16 pixels
display.setCursor(0, 57); // position du curseur
display.print("TEMP. EAU ");//affiche texte 1ere ligne 8 pixels
//display.print(dTempWater); // ici on met la 2° température eau (sonde étanche)(pin2)
display.println(sensor_eau.getTempCByIndex(0));
display.print("'"); //Affichage du symbole <C>
display.print("C"); //Affichage du symbole <C>
delay(500); // Attente 0,5 sec pour réactualiser
// pour le voltage de la batterie
// Conversion du signal (which goes from 0 - 1023) to a voltage (0 - (V):
int sensorValue = analogRead(A0);//******************************************************* A3 pour la voiture bateau
// écrit la valeur lue
float voltage = sensorValue * (5.0 / 1023.0);
display.setTextSize(1);//text size // mettre 2 pour 16 pixels
display.setCursor(0, 16);
display.print(voltage);
display.print(" V");
display.display();
}
La librairie de l'écran OLED bouffe déjà 1024 octets (soit la moitié de la RAM) pour stocker le bitmap de l'écran plus quelques variables de travail.
Donc de ton coté, il faut être très économe et optimiser ton code pour réduire l'utilisation de la RAM.
une bibliothèque allégée .
le code fournit ne prend que 44% de mémoire alors que le code fourni par l'exemple de Adafruit en prend 75%.
Par contre il est bcp plus compliqué à comprendre
Je n'arrive pas à voir où écrire mes lignes de lecture des valeurs, et quelles lignes garder ou effacer tellement il y a de données
Cette bibliothèque me semble compatible de ton code actuel : les mêmes fonctions
Afficher du texte :
display.print("56789:;<=>?@ABCDEFGHI");
et afficher l'écran :
display.display();
le setup, à adapter à ton besoin :
display.begin(); // Initialize the OLED
display.clear(ALL); // Clear the display's internal memory
display.clear(PAGE); // Clear the buffer.
Il faut juste la déclarer dans l'entête à la place de l'ancienne
#include <Wire.h> // Include Wire if you're using I2C
#include <SFE_MicroOLED.h> // Include the SFE_MicroOLED library
et bien déclarer l'écran
//////////////////////////
// MicroOLED Definition //
//////////////////////////
#define PIN_RESET 9 // Connect RST to pin 9
#define DC_JUMPER 0 // Ceci n'est pas une déclaration de pin de l'Arduino !!!
//////////////////////////////////
// MicroOLED Object Declaration //
//////////////////////////////////
MicroOLED display(PIN_RESET, DC_JUMPER); // I2C declaration
Tu utilises les pins dont tu as besoin (change 9 si tu veux l'utiliser pour autre chose) et bien sûr les A4 et A5 pour l'I2C.
Pour les "pros", qui peuvent expliquer mieux que moi, voici le code de la bibli :
/** \brief MicroOLED Constructor -- I2C Mode
Setup the MicroOLED class, configure the display to be controlled via a
I2C interface.
*/
MicroOLED::MicroOLED(uint8_t rst, uint8_t dc)
{
rstPin = rst; // Assign reset pin to private class variable
interface = MODE_I2C; // Set interface to I2C
// Set the I2C Address based on whether DC is high (1) or low (0).
// The pin is pulled low by default, so if it's not explicitly set to
// 1, just default to 0.
if (dc == 1)
i2c_address = I2C_ADDRESS_SA0_1;
else
i2c_address = I2C_ADDRESS_SA0_0;
}
avec dans le .h
#define I2C_ADDRESS_SA0_0 0b0111100
// c'est 60 en décimal
AMHA, à part dans l'entête et le setup, tu n'auras rien à changer dans ton code.
Cette librairie utilise moins de mémoire car elle déclare un afficheur plus petit
#define LCDWIDTH 64
#define LCDHEIGHT 48
Pour manipuler seulement du texte, on pourrait imaginer une librairie qui travaillerait uniquement avec un buffer de texte et qui écrirait directement dans l'afficheur. Mais cela veut dire développer une nouvelle librairie.
Quel est ce pin 9 reset ?
sur le code adafruit, il y a A4, A5, 5volt et GND comme branchement pour l'écran
et dans la continuité que dois-je déclarer ici ?
Dans le code avec adafruit , toutes les commandes sont avec display.setCursor ( display.*)
avec Spark dans le code d'exemple c'est oled.setCursor ( oled.)
Dois-je faire le remplacement ?
Dans le code adafruit j'ai cette ligne
// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN 2 //*************pin ?? pour voiture bateau
OneWire oneWire(EAU_TEMPERATURE_PIN);
Ne dois-je pas la dupliquer pour la sonde de l'air ?
Je l'ai fais et msg d'erreur de redefinition de OneWire oneWire
// Température de l'eau DS18B20
#define EAU_TEMPERATURE_PIN 2 //*************pin ?? pour voiture bateau
OneWire oneWire(EAU_TEMPERATURE_PIN);
#define AIR_TEMPERATURE_PIN 4 //*************pin ?? pour voiture bateau
OneWire oneWire(AIR_TEMPERATURE_PIN);