TTN/Lora Board V3 Atmega1284

BITTE ERST NACHBAUEN WENN ALLES GEPRÜFT UND FEHLERFREI IST!!!


Wie bereits bei den anderen Boards zu lesen. Wurde mir der 328p zu klein und mit dem STM32 hatte ich keinen Erfolg.
Daher hab ich mich auf meine Wurzeln besonnen. Wie heißt es Schuster bleib bei deinen Leisten.
Klar war zuerst die Überlegung das neue Board auf ESPs aufzubauen.
Aber nach Recherche fand ich doch heraus das dies etwas Überdimensioniert ist und auch wieder der Stromverbrauch in Vordergrund stand.
Also zurück, da ich ja einen sehr gut laufenden Code habe und auch der DeepSleep da paßt gehen wir zurück zu Atmel.
Ja auch da gibt es einen Cortex®-M0+ Kontroller. Aber ich habe mit dem STM so viel Geld verbraten das ich nicht wieder teuer Experimentieren und Probieren wollte.

Deswegen wurde es ein 1284. Dieser stellt mir genügend Pins zur verfügen auch für Anspruchsvollere Sachen und auch den Platz um nicht im Code mit Debugs Knausern zu müssen.
Außerdem hatte ich das Problem das bei den 328p ich eine alte LMIC nehmen mußte welche nicht alles unterstützt. Eben aus dem oben genannten Speicher und Ram Problem.
Ich denke das ich bei diesem Entwurf bleiben werde.

Hier der Final Schaltplan
Schaltplan:

Sorry für den CHAOTISCHEN SCHALTPLAN ich bin da nicht so Bewandert. Für mich reicht es.

Features:

  • LED_BUILTIN blaue LED nach Arduino Vorgabe
  • WS2812B RGB LED, muss mit Light2812 betrieben werden da 8Mhz
  • TP4056 Laderegler 4-8V Für Solar, Netzteil und Powerbank
  • Ladeanzeige an Pin zeigt an ob geladen wird oder nicht
  • Batteriespannungsabfrage per ADC. Zeigt beim laden falsche Werte ist ja klar.
  • LM75AD I2C Gehäusetemperatur Sensor
  • Schaltbare 3,3V VCC Spannung an LM75 Ws2812B und I2C Sensor Pins
  • I2C und eine Interrupt bereits mit 4,7k Pullup
  • Reset Taster onboard.

Interrupt mit Pullup auf Pins
3X I2C, 1. und 2. mit Vext und. 3 mit VCC Dauerstrom
WS2812 Pin mit Onboard LED Parallel geschaltet.

Ich weiß das der HT7333 bis 12v verkraftet also würde Theoretisch auch ein anderer Akku bis 12V gehen. Dies würde aber den ADC überlasten und man will ja Strom sparen.

Lora Belegung:

<#LMIC Pinmap
const lmic_pinmap lmic_pins = {
	.nss = 14,
	.rxtx = LMIC_UNUSED_PIN,
	.rst = 13,
	.dio = {10, 11, 12}

Mustercode ADC Akku auslesen und Ladeanzeige. Ladeanzeige ist ivertiert, also wenn geladen wird zeigt 0 durch den Pullup:

int TPPin = 18;   // PC2/18 Ladeanzeige Pin
int LadA = 1;     // Variable, um den gelesenen Wert zu speichern

void setup() {
  // initialisierung der seriellen Kommunikationsschnittstelle mit 9600 bits pro Sekunde
  Serial.begin(9600);
  pinMode(TPPin, INPUT);   // TPOin als Eingang zum auslesen
}

void loop() {
  LadA = digitalRead(TPPin);  // Liest den Inputpin
  // Lesen des Eingangs am analogen Pin A0:
  int sensorValue = analogRead(A7);
  // Umrechnung des Analogwertes (welcher von 0 bis 1023 reicht) in eine Spannung von (0V bis 5V):
  float voltage = sensorValue * (3.3 / 1024.0)*2;
  // Ausgabe des Wertes über die serielle Schnittstelle 
  Serial.println(voltage);
  Serial.println(LadA);
  delay(250);
  }

Mustercode Vext, LM75 und WS2812B:

//Neopix LED Light2812
#include <WS2812.h>
WS2812 LED(1); // 1 LED
cRGB value;

// LM75 Temperatur Sensir I2C
#include <Temperature_LM75_Derived.h>
Generic_LM75 temperature;

//Stromversorgung NEO, LM, I2C
int VEXT = 19;  //Digital Pin 19/PC3


void setup() {
  Wire.begin();
   

  //Seriell Start
  while (!Serial); // Leonardo: wait for serial monitor  
  Serial.begin(9600);


  //Neopix Define
	LED.setOutput(15); //Digital Pin 15/PD7

  //Stromversorgung an
  pinMode(VEXT, OUTPUT);
  digitalWrite(VEXT, HIGH);
}

void loop() {
	
	//Neopix Test
	value.b = 10; value.g = 0; value.r = 0; // RGB Value -> Blue
	LED.set_crgb_at(0, value); // Set value at LED found at index 0
	LED.sync(); // Sends the value to the LED
	delay(500); // Wait 500 ms
	
	value.b = 0; value.g = 0; value.r = 10; // RGB Value -> Red
	LED.set_crgb_at(0, value); // Set value at LED found at index 0
	LED.sync(); // Sends the value to the LED
	delay(500); // Wait 500 ms
  
  value.b = 0; value.g = 10; value.r = 0; // RGB Value -> Blue
  LED.set_crgb_at(0, value); // Set value at LED found at index 0
  LED.sync(); // Sends the value to the LED
  delay(500); // Wait 500 ms

  // Temperature
  Serial.print("Temperature = ");
  Serial.print(temperature.readTemperatureC());
  Serial.println(" C");
  digitalWrite(VEXT, LOW);
  delay(250);
  
}

Code mit allen Funktionen außer Build_LED:

//Neopix LED Light2812
#include <WS2812.h>
WS2812 LED(1); // 1 LED
cRGB value;

// LM75 Temperatur Sensir I2C
#include <Temperature_LM75_Derived.h>
Generic_LM75 temperature;

//Stromversorgung NEO, LM, I2C
int VEXT = 19;  //Digital Pin 19/PC3

int TPPin = 18;   // PC2/18 Ladeanzeige Pin
int LadA = 1;     // Variable, um den gelesenen Wert zu speichern

void setup() {
  Wire.begin();
   

  //Seriell Start
  while (!Serial); // Leonardo: wait for serial monitor  
  Serial.begin(9600);


  //Neopix Define
	LED.setOutput(15); //Digital Pin 15/PD7

  //Stromversorgung an
  pinMode(VEXT, OUTPUT);
  digitalWrite(VEXT, HIGH);

  // initialisierung der seriellen Kommunikationsschnittstelle mit 9600 bits pro Sekunde
  Serial.begin(9600);
  pinMode(TPPin, INPUT);   // TPOin als EInganz zum auslesen
}

void loop() {
	
	//Neopix Test
	value.b = 10; value.g = 0; value.r = 0; // RGB Value -> Blue
	LED.set_crgb_at(0, value); // Set value at LED found at index 0
	LED.sync(); // Sends the value to the LED
        Serial.println("RGB Blau!!!");
	delay(500); // Wait 500 ms
  
	
	value.b = 0; value.g = 0; value.r = 10; // RGB Value -> Red
	LED.set_crgb_at(0, value); // Set value at LED found at index 0
	LED.sync(); // Sends the value to the LED
        Serial.println("RGB Rot!!!");
	delay(500); // Wait 500 ms
  
       value.b = 0; value.g = 10; value.r = 0; // RGB Value -> Blue
       LED.set_crgb_at(0, value); // Set value at LED found at index 0
      LED.sync(); // Sends the value to the LED
      Serial.println("RGB Grün!!!");
      delay(500); // Wait 500 ms

  // Temperature
  Serial.print("Temperature = ");
  Serial.print(temperature.readTemperatureC());
  Serial.println(" °C");

  LadA = digitalRead(TPPin);  // Liest den Inputpin
  // Lesen des Eingangs am analogen Pin A0:
  int sensorValue = analogRead(A7);
  // Umrechnung des Analogwertes (welcher von 0 bis 1023 reicht) in eine Spannung von (0V bis 5V):
  float voltage = sensorValue * (3.3 / 1024.0)*2;
  // Ausgabe des Wertes über die serielle Schnittstelle 
  Serial.print("Batterie Spannung: ");
  Serial.print(voltage);
  Serial.println(" V");
  Serial.print("Ladeanzeige: ");
  Serial.print(LadA);
  Serial.println(" 0 = ladet");

  delay(250);
digitalWrite(VEXT, LOW);
  
}

Unter Arduino/Plattform IO muß das Mighty Board
https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json
installiert sein.

Einstellungen:

Ich hoffe ich konnte euch helfen. Wenn ja würde ich mich über einen Kaffee freuen.

https://www.buymeacoffee.com/M.Lavalle